BatteryStatsImpl.java revision 3f7e35c2c7d3d7f08f50c1d93cd16b1f49354ccc
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.NetStat; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 25c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 27e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 28627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 43c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. All times are represented in microseconds except where indicated 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "BatteryStatsImpl"; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG = false; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAGIC = 0xBA757475; // 'BATSTATS' 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Current on-disk Parcel version 593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private static final int VERSION = 39; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final File mFile; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final File mBackupFile; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected organized by uids. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SparseArray<BatteryStatsImpl.Uid> mUidStats = 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SparseArray<BatteryStatsImpl.Uid>(); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A set of pools of currently active timers. When a timer is queried, we will divide the 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // elapsed time by the number of active timers to arrive at that timer's share of the time. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In order to do this, we must refresh each timer whenever the number of active timers 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes. 74c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>(); 75c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>(); 76c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>(); 77c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers 78c64edde69d18498fb2954f71a546357b07ab996aEvan Millar = new SparseArray<ArrayList<StopwatchTimer>>(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are the objects that will want to do something when the device 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is unplugged from power. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStartCount; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryUptime; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastUptime; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryRealtime; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastRealtime; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptime; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptimeStart; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUptime; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtime; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtimeStart; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastRealtime; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mScreenOn; 99c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScreenOnTimer; 1003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mScreenBrightnessBin = -1; 102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; 103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter mInputEventCounter; 105617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mPhoneOn; 107c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mPhoneOnTimer; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 109244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioOn; 110244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioOnTimer; 111244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 112244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoOn; 113244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoOnTimer; 114244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 115627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneSignalStrengthBin = -1; 116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneSignalStrengthsTimer = 117c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS]; 118627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 119627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneDataConnectionType = -1; 120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneDataConnectionsTimer = 121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_DATA_CONNECTION_TYPES]; 122627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 123105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mWifiOn; 124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiOnTimer; 125617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mWifiOnUid = -1; 126d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 127d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood boolean mWifiRunning; 128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiRunningTimer; 129105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 130105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mBluetoothOn; 131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mBluetoothOnTimer; 1323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 1333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** Bluetooth headset object */ 1343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani BluetoothHeadset mBtHeadset; 1353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These provide time bases that discount the time the device is plugged 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in to power. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBattery; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBatteryInternal; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastUptime; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryUptimeStart; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastRealtime; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryRealtimeStart; 1463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryUptime; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryRealtime; 1493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 150105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /* 151105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * These keep track of battery levels (1-100) at the last plug event and the last unplug event. 152105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 153633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeStartLevel; 154633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeCurrentLevel; 155244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastWriteTime = 0; // Milliseconds 157244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Mobile data transferred while on battery 1593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataTx = new long[4]; 1603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataRx = new long[4]; 1613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataTx = new long[4]; 1623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataRx = new long[4]; 1633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 1643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataUptime; 1653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataStart; 1663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 1673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingCount; 1683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingStart = -1; 1693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 170c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 171c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Holds a SamplingTimer associated with each kernel wakelock name being tracked. 172c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 173c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final HashMap<String, SamplingTimer> mKernelWakelockStats = 174c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, SamplingTimer>(); 175c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public Map<String, ? extends SamplingTimer> getKernelWakelockStats() { 177c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mKernelWakelockStats; 178c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 179c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 180c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static int sKernelWakelockUpdateVersion = 0; 181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 182c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static final int[] PROC_WAKELOCKS_FORMAT = new int[] { 183c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_STRING, // 0: name 184c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 1: count 185c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 186c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 187c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 188c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 5: totalTime 189c64edde69d18498fb2954f71a546357b07ab996aEvan Millar }; 190c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 191c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final String[] mProcWakelocksName = new String[3]; 192c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final long[] mProcWakelocksData = new long[3]; 193c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 195c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added 196c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * to mKernelWakelockStats. 197c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 198c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> mProcWakelockFileStats = 199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, KernelWakelockStats>(); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>(); 20232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For debugging 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl() { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile = mBackupFile = null; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface Unpluggable { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unplug(long batteryUptime, long batteryRealtime); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void plug(long batteryUptime, long batteryRealtime); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 214617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * State for keeping track of counting information. 215617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 216617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static final class Counter extends BatteryStats.Counter implements Unpluggable { 217617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mCount; 218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLoadedCount; 219617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLastCount; 220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mUnpluggedCount; 221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mPluggedCount; 222617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 223617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables, Parcel in) { 224617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mPluggedCount = mCount = in.readInt(); 225617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLoadedCount = in.readInt(); 226617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLastCount = in.readInt(); 227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = in.readInt(); 228617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 229617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 230617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 231617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables) { 232617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 233617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 234617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 235617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void writeToParcel(Parcel out) { 236617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mCount); 237617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLoadedCount); 238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLastCount); 239617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mUnpluggedCount); 240617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 241617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 242617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void unplug(long batteryUptime, long batteryRealtime) { 243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = mCount = mPluggedCount; 244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 245617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 246617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void plug(long batteryUptime, long batteryRealtime) { 247617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mPluggedCount = mCount; 248617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 249617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 250617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 251617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * Writes a possibly null Counter to a Parcel. 252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 253617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param out the Parcel to be written to. 254617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param counter a Counter, or null. 255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static void writeCounterToParcel(Parcel out, Counter counter) { 257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (counter == null) { 258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); // indicates null 259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return; 260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); // indicates non-null 262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn counter.writeToParcel(out); 264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 267c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 268617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int val; 269617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_LAST) { 270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val = mLastCount; 271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 272617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val = mCount; 273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_UNPLUGGED) { 274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mUnpluggedCount; 275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else if (which != STATS_TOTAL) { 276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mLoadedCount; 277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return val; 281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void logState(Printer pw, String prefix) { 284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn pw.println(prefix + "mCount=" + mCount 285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mUnpluggedCount=" + mUnpluggedCount 287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mPluggedCount=" + mPluggedCount); 288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void stepLocked() { 291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mCount++; 292617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 294617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void writeSummaryFromParcelLocked(Parcel out) { 295617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mCount); 296617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mCount - mLoadedCount); 297617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 298617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void readSummaryFromParcelLocked(Parcel in) { 300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mCount = mLoadedCount = in.readInt(); 301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLastCount = in.readInt(); 302617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = mPluggedCount = mCount; 303617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 304617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 306617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for keeping track of timing information. 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static abstract class Timer extends BatteryStats.Timer implements Unpluggable { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mType; 311c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedCount; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastCount; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedCount; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Times are in microseconds for better accuracy when dividing by the 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock count, and are in "battery realtime" units. 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we have accumulated since the start of the original 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * boot, to the last time something interesting happened in the 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current run. 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTotalTime; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we loaded for the previous runs. Subtract this from 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mTotalTime to find the time for the current run of the system. 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTime; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The run time of the last run of the system, as loaded from the 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved data. 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastTime; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value of mTotalTime when unplug() was last called. Subtract 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this from mTotalTime to find the time since the last unplug from 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * power. 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedTime; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 347244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani /** 348244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * Constructs from a parcel. 349244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param type 350244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param unpluggables 351244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param powerType 352244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param in 353244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani */ 354c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 356c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount = in.readInt(); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedCount = in.readInt(); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastCount = in.readInt(); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = in.readInt(); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = in.readLong(); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTime = in.readLong(); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastTime = in.readLong(); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = in.readLong(); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 368c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 372c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 373c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract long computeRunTimeLocked(long curBatteryRealtime); 374c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 375c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract int computeCurrentCountLocked(); 376c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, long batteryRealtime) { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mCount); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedCount); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastCount); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedCount); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRunTimeLocked(batteryRealtime)); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTime); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastTime); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedTime); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedTime=" + mUnpluggedTime 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedCount=" + mUnpluggedCount); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = computeRunTimeLocked(batteryRealtime); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = mCount; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": new mUnpluggedTime=" + mUnpluggedTime 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new mUnpluggedCount=" + mUnpluggedCount); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 405c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 406c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime 407c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " old mTotalTime=" + mTotalTime); 408c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 409c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = computeRunTimeLocked(batteryRealtime); 410c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = computeCurrentCountLocked(); 411c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 412c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType 413c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + ": new mTotalTime=" + mTotalTime); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a possibly null Timer to a Parcel. 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer, or null. 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void writeTimerToParcel(Parcel out, Timer timer, 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer == null) { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); // indicates null 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); // indicates non-null 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timer.writeToParcel(out, batteryRealtime); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 435c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long getTotalTimeLocked(long batteryRealtime, int which) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastTime; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = computeRunTimeLocked(batteryRealtime); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedTime; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which != STATS_TOTAL) { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedTime; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 452c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastCount; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar val = computeCurrentCountLocked(); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedCount; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which != STATS_TOTAL) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedCount; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 468627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void logState(Printer pw, String prefix) { 469c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + " mCount=" + mCount 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedCount=" + mUnpluggedCount); 472627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mTotalTime=" + mTotalTime 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedTime=" + mLoadedTime); 474627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mLastTime=" + mLastTime 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedTime=" + mUnpluggedTime); 476c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 478c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 479c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long runTime = computeRunTimeLocked(batteryRealtime); 481c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Divide by 1000 for backwards compatibility 482c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong((runTime + 500) / 1000); 483c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(((runTime - mLoadedTime) + 500) / 1000); 484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount); 485c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount - mLoadedCount); 486c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 487c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 488c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 489c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Multiply by 1000 for backwards compatibility 490c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = mLoadedTime = in.readLong() * 1000; 491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mLastTime = in.readLong() * 1000; 492c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedTime = mTotalTime; 493c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = mLoadedCount = in.readInt(); 494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mLastCount = in.readInt(); 495c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedCount = mCount; 496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 497c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 498c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 499c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class SamplingTimer extends Timer { 500c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 501c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 502c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported count from /proc/wakelocks. 503c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 504c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mCurrentReportedCount; 505c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 506c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 507c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported count from /proc/wakelocks when unplug() was last 508c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 509c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 510c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUnpluggedReportedCount; 511c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 512c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 513c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported total_time from /proc/wakelocks. 514c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 515c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mCurrentReportedTotalTime; 516c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 517c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported total_time from /proc/wakelocks when unplug() was last 520c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUnpluggedReportedTotalTime; 523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently in a discharge cycle. 526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mInDischarge; 528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 529c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently recording reported values. 531c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 532c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mTrackingReportedValues; 533c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 534c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 535c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * A sequnce counter, incremented once for each update of the stats. 536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUpdateVersion; 538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) { 540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables, in); 541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = in.readInt(); 542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = in.readInt(); 543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = in.readLong(); 544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = in.readLong(); 545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, 550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean trackReportedValues) { 551c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables); 552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = trackReportedValues; 553c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 556c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setStale() { 557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = false; 558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = 0; 559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = 0; 560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setUpdateVersion(int version) { 563c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateVersion = version; 564c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getUpdateVersion() { 567c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUpdateVersion; 568c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 569c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedCount(int count) { 571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedCount == 0) { 572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = count; 574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = count; 578c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 579c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 580c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedTotalTime(long totalTime) { 581c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedTotalTime == 0) { 582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = totalTime; 584c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 585c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 586c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = totalTime; 588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void unplug(long batteryUptime, long batteryRealtime) { 591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.unplug(batteryUptime, batteryRealtime); 592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mTrackingReportedValues) { 593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime; 594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount; 595c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = true; 597c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 598c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = false; 602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 603c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount 607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedCount=" + mUnpluggedReportedCount 608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime 609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime); 610c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mTotalTime + (mInDischarge && mTrackingReportedValues 614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0); 615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount + (mInDischarge && mTrackingReportedValues 619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedCount - mUnpluggedReportedCount : 0); 620c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 623c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 624c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 625c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mUnpluggedReportedCount); 626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUnpluggedReportedTotalTime); 628c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeSummaryFromParcelLocked(out, batteryRealtime); 633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong(); 641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount = in.readInt(); 642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * State for keeping track of timing information. 648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class StopwatchTimer extends Timer { 650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mTimerPool; 651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mNesting; 652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The last time at which we updated the timer. If mNesting is > 0, 656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * subtract this from the current battery time to find the amount of 657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * time we have been running since we last computed an update. 658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUpdateTime; 660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The total time at which the timer was acquired, to determine if 663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * was actually held for an interesting duration. 664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mAcquireTime; 666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool, 668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables, Parcel in) { 669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables, in); 670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = in.readLong(); 672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool, 675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables) { 676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables); 677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUpdateTime); 683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mNesting > 0) { 687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "old mUpdateTime=" + mUpdateTime); 689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = batteryRealtime; 692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "new mUpdateTime=" + mUpdateTime); 694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startRunningLocked(BatteryStatsImpl stats) { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting++ == 0) { 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUpdateTime = stats.getBatteryRealtimeLocked( 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.elapsedRealtime() * 1000); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all currently active timers before adding 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this new one to the pool. 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add this timer to the active pool 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.add(this); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Increment the count 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount++; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAcquireTime = mTotalTime; 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 72632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani boolean isRunningLocked() { 72732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return mNesting > 0; 72832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 72932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopRunningLocked(BatteryStatsImpl stats) { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore attempt to stop a timer that isn't running 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting == 0) { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (--mNesting == 0) { 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all active counters, scaled by the total 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // active in the pool, before taking this one out of the pool. 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove this timer from the active pool 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.remove(this); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long realtime = SystemClock.elapsedRealtime() * 1000; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 1; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = computeRunTimeLocked(batteryRealtime); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTotalTime == mAcquireTime) { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there was no change in the time, then discard this 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // count. A somewhat cheezy strategy, but hey. 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount--; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update the total time for all other running Timers with the same type as this Timer 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // due to a change in timer count 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void refreshTimersLocked(final BatteryStatsImpl stats, 767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> pool) { 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long realtime = SystemClock.elapsedRealtime() * 1000; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = pool.size(); 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>= 0; i--) { 772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer t = pool.get(i); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long heldTime = batteryRealtime - t.mUpdateTime; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (heldTime > 0) { 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mTotalTime += heldTime / N; 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mUpdateTime = batteryRealtime; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTotalTime + (mNesting > 0 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (curBatteryRealtime - mUpdateTime) 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project / (mTimerPool != null ? mTimerPool.size() : 1) 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : 0); 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readSummaryFromParcelLocked(Parcel in) { 795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> readKernelWakelockStats() { 801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] buffer = new byte[4096]; 803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int len; 804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar try { 806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar FileInputStream is = new FileInputStream("/proc/wakelocks"); 807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = is.read(buffer); 808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar is.close(); 809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (len > 0) { 811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i=0; i<len; i++) { 813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (buffer[i] == '\0') { 814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = i; 815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar break; 816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.FileNotFoundException e) { 820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.IOException e) { 822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return parseProcWakelocks(buffer, len); 826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> parseProcWakelocks( 829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] wlBuffer, int len) { 830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name; 831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count; 832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long totalTime; 833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int startIndex, endIndex; 834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int numUpdatedWlNames = 0; 835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Advance past the first line. 837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++); 839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex = i + 1; 840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar synchronized(this) { 842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = mProcWakelockFileStats; 843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion++; 845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (endIndex < len) { 846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (endIndex=startIndex; 847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0'; 848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex++); 849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex++; // endIndex is an exclusive upper bound. 850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String[] nameStringArray = mProcWakelocksName; 852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long[] wlData = mProcWakelocksData; 853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.parseProcLine(wlBuffer, startIndex, endIndex, PROC_WAKELOCKS_FORMAT, 854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar nameStringArray, wlData, null); 855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar name = nameStringArray[0]; 857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar count = (int) wlData[1]; 858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // convert nanoseconds to microseconds with rounding. 859c64edde69d18498fb2954f71a546357b07ab996aEvan Millar totalTime = (wlData[2] + 500) / 1000; 860c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 861c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (name.length() > 0) { 862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (!m.containsKey(name)) { 863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar m.put(name, new KernelWakelockStats(count, totalTime, 864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion)); 865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kwlStats = m.get(name); 868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlStats.mVersion == sKernelWakelockUpdateVersion) { 869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount += count; 870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime += totalTime; 871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount = count; 873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime = totalTime; 874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mVersion = sKernelWakelockUpdateVersion; 875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex; 880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != numUpdatedWlNames) { 883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Don't report old data. 884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Iterator<KernelWakelockStats> itr = m.values().iterator(); 885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (itr.hasNext()) { 886c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (itr.next().mVersion != sKernelWakelockUpdateVersion) { 887c64edde69d18498fb2954f71a546357b07ab996aEvan Millar itr.remove(); 888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 889c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 890c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return m; 892c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 895c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private class KernelWakelockStats { 896c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mCount; 897c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long mTotalTime; 898c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mVersion; 899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 900c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats(int count, long totalTime, int version) { 901c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = count; 902c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = totalTime; 903c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mVersion = version; 904c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 905c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 907c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 908c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Get the KernelWakelockTimer associated with name, and create a new one if one 909c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * doesn't already exist. 910c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 911c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public SamplingTimer getKernelWakelockTimerLocked(String name) { 912c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 913c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 914c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 915c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 916c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 917c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 918c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return kwlt; 919c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 9203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 9213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataPlug(long[] dataTransfer, long currentBytes) { 9223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani dataTransfer[STATS_LAST] = dataTransfer[STATS_UNPLUGGED]; 9233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani dataTransfer[STATS_UNPLUGGED] = -1; 9243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 9253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 9263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataUnplug(long[] dataTransfer, long currentBytes) { 9273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani dataTransfer[STATS_UNPLUGGED] = currentBytes; 9283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 9293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 9303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 9313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Radio uptime in microseconds when transferring data. This value is very approximate. 9323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @return 9333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 9343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private long getCurrentRadioDataUptime() { 9353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani try { 9363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms"); 9373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (!awakeTimeFile.exists()) return 0; 9383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile)); 9393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani String line = br.readLine(); 9403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani br.close(); 9413f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return Long.parseLong(line) * 1000; 9423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (NumberFormatException nfe) { 9433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 9443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (IOException ioe) { 9453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 9463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 9473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return 0; 9483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 9493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 9503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 9513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @deprecated use getRadioDataUptime 9523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 9533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getRadioDataUptimeMs() { 9543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getRadioDataUptime() / 1000; 9553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 9563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 9573f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 9583f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Returns the duration that the cell radio was up for data transfers. 9593f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 9603f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public long getRadioDataUptime() { 9613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (mRadioDataStart == -1) { 9623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return mRadioDataUptime; 9633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 9643f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentRadioDataUptime() - mRadioDataStart; 9653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 9663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 9673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 9683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int getCurrentBluetoothPingCount() { 9693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBtHeadset != null) { 9703f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return mBtHeadset.getBatteryUsageHint(); 9713f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 9723f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return -1; 9733f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 9743f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 9753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public int getBluetoothPingCount() { 9763f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBluetoothPingStart == -1) { 9773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return mBluetoothPingCount; 9783f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } else if (mBtHeadset != null) { 9793f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentBluetoothPingCount() - mBluetoothPingStart; 9803f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 9813f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return -1; 9823f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 9833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 9843f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public void setBtHeadset(BluetoothHeadset headset) { 9853f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBtHeadset = headset; 9863f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 9873f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void doUnplug(long batteryUptime, long batteryRealtime) { 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesReceived = NetStat.getUidRxBytes(u.mUid); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesSent = NetStat.getUidTxBytes(u.mUid); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived; 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track total mobile data 10003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani doDataUnplug(mMobileDataRx, NetStat.getMobileRxBytes()); 10013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani doDataUnplug(mMobileDataTx, NetStat.getMobileTxBytes()); 10023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani doDataUnplug(mTotalDataRx, NetStat.getTotalRxBytes()); 10033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani doDataUnplug(mTotalDataTx, NetStat.getTotalTxBytes()); 10043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 10053f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataStart = getCurrentRadioDataUptime(); 10063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = 0; 10073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 10083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 10093f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = 0; 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void doPlug(long batteryUptime, long batteryRealtime) { 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesReceived >= 0) { 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived(); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesReceived = -1; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesSent >= 0) { 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent(); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesSent = -1; 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).plug(batteryUptime, batteryRealtime); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani doDataPlug(mMobileDataRx, NetStat.getMobileRxBytes()); 10283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani doDataPlug(mMobileDataTx, NetStat.getMobileTxBytes()); 10293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani doDataPlug(mTotalDataRx, NetStat.getTotalRxBytes()); 10303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani doDataPlug(mTotalDataTx, NetStat.getTotalTxBytes()); 10313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 10323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataUptime = getRadioDataUptime(); 10333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 10343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 10353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 10363f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = getBluetoothPingCount(); 10373f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 10412e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStartGps(); 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 10452e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStopGps(); 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOnLocked() { 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mScreenOn) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = true; 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.startRunningLocked(this); 1052617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1053617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this); 1054617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOffLocked() { 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mScreenOn) { 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.stopRunningLocked(this); 1062617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1063617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1064617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1065617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1066617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1067617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1068617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightnessLocked(int brightness) { 1069617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Bin the brightness. 1070617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS); 1071617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (bin < 0) bin = 0; 1072617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1; 1073617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin != bin) { 1074617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenOn) { 1075617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1076617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1077617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1078617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[bin].startRunningLocked(this); 1079617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1080617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessBin = bin; 1081617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1082617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1083617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1084617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteInputEventLocked() { 1085617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.stepLocked(); 1086617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1087617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1088617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int uid, int event) { 10892e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteUserActivityLocked(event); 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOnLocked() { 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPhoneOn) { 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = true; 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.startRunningLocked(this); 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOffLocked() { 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPhoneOn) { 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.stopRunningLocked(this); 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 110532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 110632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani public void noteAirplaneModeLocked(boolean isAirplaneMode) { 110732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani final int bin = mPhoneSignalStrengthBin; 110832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani if (bin >= 0) { 110932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani if (!isAirplaneMode) { 111032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) { 111132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 111232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 111332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } else { 111432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) { 111532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) { 111632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mPhoneSignalStrengthsTimer[i].stopRunningLocked(this); 111732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 111832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 111932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 112032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 112132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 112232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 1123e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) { 1124627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Bin the strength. 1125627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin; 1126e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1127e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (!signalStrength.isGsm()) { 1128e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int dBm = signalStrength.getCdmaDbm(); 1129e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (dBm >= -75) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1130e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (dBm >= -85) bin = SIGNAL_STRENGTH_GREAT; 1131e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (dBm >= -95) bin = SIGNAL_STRENGTH_GOOD; 1132e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (dBm >= -100) bin = SIGNAL_STRENGTH_MODERATE; 1133e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else bin = SIGNAL_STRENGTH_POOR; 1134e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } else { 1135e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int asu = signalStrength.getGsmSignalStrength(); 1136e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1137e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT; 1138e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 8) bin = SIGNAL_STRENGTH_GOOD; 1139e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 4) bin = SIGNAL_STRENGTH_MODERATE; 1140e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else bin = SIGNAL_STRENGTH_POOR; 1141e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1142627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneSignalStrengthBin != bin) { 1143627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneSignalStrengthBin >= 0) { 1144627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this); 1145627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1146627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthBin = bin; 1147627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 1148627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1149627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1150627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1151627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) { 1152627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin = DATA_CONNECTION_NONE; 1153627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (hasData) { 1154627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn switch (dataType) { 1155627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_EDGE: 1156627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_EDGE; 1157627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1158627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_GPRS: 1159627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_GPRS; 1160627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1161627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_UMTS: 1162627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_UMTS; 1163627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1164627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn default: 1165627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_OTHER; 1166627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1167627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1168627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 11693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData); 1170627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType != bin) { 1171627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType >= 0) { 1172627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this); 1173627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1174627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionType = bin; 1175627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[bin].startRunningLocked(this); 1176627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1177627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1178627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1179617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiOnLocked(int uid) { 1180105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mWifiOn) { 1181105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = true; 1182105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.startRunningLocked(this); 1183105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1184617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid != uid) { 1185617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 11862e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked(); 1187617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1188617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = uid; 11892e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiTurnedOnLocked(); 1190617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1191105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1192105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1193617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiOffLocked(int uid) { 1194105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mWifiOn) { 1195105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 1196105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.stopRunningLocked(this); 1197105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 11992e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked(); 1200617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = -1; 1201617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1202105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1203244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1204244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOnLocked(int uid) { 1205244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioOn) { 1206244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = true; 1207244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.startRunningLocked(this); 1208244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 12092e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOnLocked(); 1210244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1211105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1212244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOffLocked(int uid) { 1213244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioOn) { 1214244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = false; 1215244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.stopRunningLocked(this); 1216244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 12172e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOffLocked(); 1218244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1219244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1220244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOnLocked(int uid) { 1221244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoOn) { 1222244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = true; 1223244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.startRunningLocked(this); 1224244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 12252e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOnLocked(); 1226244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1227244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1228244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOffLocked(int uid) { 1229244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoOn) { 1230244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = false; 1231244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.stopRunningLocked(this); 1232244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 12332e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOffLocked(); 1234244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1235244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1236d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public void noteWifiRunningLocked() { 1237d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood if (!mWifiRunning) { 1238d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = true; 1239d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.startRunningLocked(this); 1240d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1241d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1242d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1243d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public void noteWifiStoppedLocked() { 1244d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood if (mWifiRunning) { 1245d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 1246d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.stopRunningLocked(this); 1247d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1248d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1249d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOnLocked() { 1251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mBluetoothOn) { 1252105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = true; 1253105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.startRunningLocked(this); 1254105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOffLocked() { 1258105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mBluetoothOn) { 1259105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 1260105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.stopRunningLocked(this); 1261105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked(int uid) { 12652e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked(); 1266105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1267105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1268105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked(int uid) { 12692e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockReleasedLocked(); 1270105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1271105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1272105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked(int uid) { 12732e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked(); 1274105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1275105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1276105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked(int uid) { 12772e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockReleasedLocked(); 1278105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 12795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 12805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked(int uid) { 12812e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastEnabledLocked(); 12825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 12835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 12845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked(int uid) { 12852e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastDisabledLocked(); 12865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 12875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getScreenOnTime(long batteryRealtime, int which) { 1289c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which); 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1292617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public long getScreenBrightnessTime(int brightnessBin, 1293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long batteryRealtime, int which) { 1294c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked( 1295617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn batteryRealtime, which); 1296617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1297244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1298617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getInputEventCount(int which) { 1299c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mInputEventCounter.getCountLocked(which); 1300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getPhoneOnTime(long batteryRealtime, int which) { 1303c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which); 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1305244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneSignalStrengthTime(int strengthBin, 1307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 1308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked( 1309627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 1310627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1311627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1312617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneSignalStrengthCount(int dataType, int which) { 1313c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 1314617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1315617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1316627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneDataConnectionTime(int dataType, 1317627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 1318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked( 1319627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 1320627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1321627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1322617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneDataConnectionCount(int dataType, int which) { 1323c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 1324617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1325617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1326105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getWifiOnTime(long batteryRealtime, int which) { 1327c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which); 1328105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1329105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1330d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood @Override public long getWifiRunningTime(long batteryRealtime, int which) { 1331c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 1332d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1333d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1334105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getBluetoothOnTime(long batteryRealtime, int which) { 1335c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which); 1336105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1337105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean getIsOnBattery() { 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUidStats; 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular uid. 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Uid extends BatteryStats.Uid { 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mUid; 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesReceived; 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesSent; 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesReceived; 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesSent; 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesReceivedAtLastUnplug; 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesSentAtLastUnplug; 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are not saved/restored when parcelling, since we want 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to return from the parcel with a snapshot of the state. 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesReceived = -1; 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesSent = -1; 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn boolean mWifiTurnedOn; 1365c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiTurnedOnTimer; 1366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1367105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mFullWifiLockOut; 1368c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mFullWifiLockTimer; 1369105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1370105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mScanWifiLockOut; 1371c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScanWifiLockTimer; 1372244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 13735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt boolean mWifiMulticastEnabled; 13745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt StopwatchTimer mWifiMulticastTimer; 1375244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1376244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioTurnedOn; 1377244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioTurnedOnTimer; 1378244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1379244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoTurnedOn; 1380244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoTurnedOnTimer; 13815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 1382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter[] mUserActivityCounters; 1383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's wake locks. 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>(); 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's sensor activations. 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>(); 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>(); 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>(); 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid(int uid) { 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUid = uid; 1406c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables); 1407c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables); 1408c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables); 14095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED, 14105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt null, mUnpluggables); 1411244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables); 1412244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables); 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() { 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWakelockStats; 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() { 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSensorStats; 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() { 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProcessStats; 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() { 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageStats; 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1434eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1435eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getUid() { 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUid; 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1440eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesReceived(int which) { 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesReceived; 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesReceived(); 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesReceivedAtLastUnplug; 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_TOTAL) { 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesReceived; 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesReceived() { 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (NetStat.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0); 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1460eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesSent(int which) { 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesSent; 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesSent(); 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesSentAtLastUnplug; 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_TOTAL) { 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesSent; 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1475105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1476617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiTurnedOnLocked() { 1477617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (!mWifiTurnedOn) { 1478617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOn = true; 1479617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 1480617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1481617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1482617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1483617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1484617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiTurnedOffLocked() { 1485617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiTurnedOn) { 1486617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOn = false; 1487617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 1488617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1489617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1490617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1491617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1492105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked() { 1493105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mFullWifiLockOut) { 1494105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = true; 1495105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 1496105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1497105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1498105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1499105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1500244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoTurnedOnLocked() { 1501244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoTurnedOn) { 1502244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOn = true; 1503244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 1504244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1505244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1506244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1507244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1508244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoTurnedOffLocked() { 1509244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoTurnedOn) { 1510244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOn = false; 1511244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 1512244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1513244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1514244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1515244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1516244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioTurnedOnLocked() { 1517244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioTurnedOn) { 1518244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOn = true; 1519244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 1520244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1521244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1522244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1523244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1524244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioTurnedOffLocked() { 1525244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioTurnedOn) { 1526244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOn = false; 1527244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 1528244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1529244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1530244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1531244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked() { 1533105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mFullWifiLockOut) { 1534105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 1535105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 1536105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1537105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1538105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1539105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked() { 1541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mScanWifiLockOut) { 1542105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = true; 1543105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 1544105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1546105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1548105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked() { 1549105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mScanWifiLockOut) { 1550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 1551105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 1552105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1553105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 15545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 15555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 15565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked() { 15575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (!mWifiMulticastEnabled) { 15585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = true; 15595347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this); 15605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 15615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 15625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 15635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 15645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked() { 15655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (mWifiMulticastEnabled) { 15665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 15675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this); 15685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 15695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 15705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 1571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public long getWifiTurnedOnTime(long batteryRealtime, int which) { 1573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 1574617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1575244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1576244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1577244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public long getAudioTurnedOnTime(long batteryRealtime, int which) { 1578244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 1579244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1580244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1581244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public long getVideoTurnedOnTime(long batteryRealtime, int which) { 1583244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 1584244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1585244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1586105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1587105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getFullWifiLockTime(long batteryRealtime, int which) { 1588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 1589105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1590105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1591105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1592105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getScanWifiLockTime(long batteryRealtime, int which) { 1593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 1594105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 15955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 15965347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 15975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public long getWifiMulticastTime(long batteryRealtime, int which) { 15985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime, 15995347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt which); 16005347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 16015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 1602617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1603617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int type) { 1604617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 1605617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn initUserActivityLocked(); 1606617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (type < 0) type = 0; 1608617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1; 1609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[type].stepLocked(); 1610617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1611617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1612617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1613617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public boolean hasUserActivity() { 1614617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return mUserActivityCounters != null; 1615617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1616617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1617617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1618617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public int getUserActivityCount(int type, int which) { 1619617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 1620617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return 0; 1621617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUserActivityCounters[type].getCountLocked(which); 1623617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1624617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1625617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void initUserActivityLocked() { 1626617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 1627617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 1628617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables); 1629617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1630617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1631617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesSent() { 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (NetStat.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0); 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1636244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakelockStats.size()); 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) { 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(wakelockEntry.getKey()); 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = wakelockEntry.getValue(); 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.writeToParcelLocked(out, batteryRealtime); 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mSensorStats.size()); 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) { 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(sensorEntry.getKey()); 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = sensorEntry.getValue(); 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.writeToParcelLocked(out, batteryRealtime); 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mProcessStats.size()); 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) { 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(procEntry.getKey()); 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = procEntry.getValue(); 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.writeToParcelLocked(out); 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mPackageStats.size()); 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) { 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(pkgEntry.getKey()); 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = pkgEntry.getValue(); 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.writeToParcelLocked(out); 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesReceived); 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesSent); 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesReceived()); 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesSent()); 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesReceivedAtLastUnplug); 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesSentAtLastUnplug); 1672617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime); 1673105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.writeToParcel(out, batteryRealtime); 1674244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime); 1675244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime); 1676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.writeToParcel(out, batteryRealtime); 16775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.writeToParcel(out, batteryRealtime); 1678617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 1679617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 1680617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 1681617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 1682617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 1683617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i].writeToParcel(out); 1684617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1685617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numWakelocks = in.readInt(); 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.clear(); 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < numWakelocks; j++) { 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wakelockName = in.readString(); 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = new Wakelock(); 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.readFromParcelLocked(unpluggables, in); 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.put(wakelockName, wakelock); 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numSensors = in.readInt(); 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.clear(); 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numSensors; k++) { 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = in.readInt(); 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = new Sensor(sensorNumber); 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.readFromParcelLocked(mUnpluggables, in); 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensorNumber, sensor); 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numProcs = in.readInt(); 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.clear(); 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numProcs; k++) { 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String processName = in.readString(); 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = new Proc(); 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.readFromParcelLocked(in); 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(processName, proc); 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numPkgs = in.readInt(); 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.clear(); 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int l = 0; l < numPkgs; l++) { 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = in.readString(); 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = new Pkg(); 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.readFromParcelLocked(in); 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(packageName, pkg); 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesReceived = in.readLong(); 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesSent = in.readLong(); 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesReceived = in.readLong(); 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesSent = in.readLong(); 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesReceivedAtLastUnplug = in.readLong(); 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesSentAtLastUnplug = in.readLong(); 1731617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOn = false; 1732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables, in); 1733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 1734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables, in); 1735244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOn = false; 1736244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables, in); 1737244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOn = false; 1738244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables, in); 1739105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 1740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables, in); 17415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 17425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED, 17435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt null, mUnpluggables, in); 1744617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() == 0) { 1745617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = null; 1746617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 1747617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 1748617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 1749617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables, in); 1750617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1751617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular wake lock. 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Wakelock extends BatteryStats.Uid.Wakelock { 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device partially awake. 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerPartial; 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device fully awake. 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerFull; 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has had a window keeping the device awake. 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerWindow; 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a possibly null Timer from a Parcel. The timer is associated with the 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proper timer pool from the given BatteryStatsImpl object. 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in the Parcel to be read from. 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return a new Timer, or null. 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool, 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<Unpluggable> unpluggables, Parcel in) { 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return new StopwatchTimer(type, pool, unpluggables, in); 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers, unpluggables, in); 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers, unpluggables, in); 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers, unpluggables, in); 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime); 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime); 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime); 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getWakeTime(int type) { 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: return mTimerFull; 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: return mTimerPartial; 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: return mTimerWindow; 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: throw new IllegalArgumentException("type = " + type); 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Sensor extends BatteryStats.Uid.Sensor { 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mHandle; 1817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimer; 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Sensor(int handle) { 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandle = handle; 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables, 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in) { 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle); 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool == null) { 1831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pool = new ArrayList<StopwatchTimer>(); 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(mHandle, pool); 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return new StopwatchTimer(0, pool, unpluggables, in); 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimer = readTimerFromParcel(unpluggables, in); 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimer, batteryRealtime); 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getSensorTime() { 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTimer; 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1850eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHandle() { 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHandle; 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable { 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in user code. 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUserTime; 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in kernel code. 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSystemTime; 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times the process has been started. 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1876eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Amount of time the process was running in the foreground. 1877eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 1878eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mForegroundTime; 1879eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1880eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from a previous save. 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedUserTime; 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from a previous save. 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedSystemTime; 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from a previous save. 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1896eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from a previous save. 1897eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 1898eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLoadedForegroundTime; 1899eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1900eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from the previous run. 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUserTime; 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from the previous run. 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastSystemTime; 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from the previous run. 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1916eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from the previous run 1917eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 1918eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLastForegroundTime; 1919eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1920eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time when last unplugged. 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedUserTime; 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time when last unplugged. 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedSystemTime; 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started before unplugged. 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1935eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 1936eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time since unplugged. 1937eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 1938eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mUnpluggedForegroundTime; 1939eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc() { 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = mUserTime; 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = mSystemTime; 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 1948eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = mForegroundTime; 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 1955105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 1956105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 1957105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUserTime); 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mSystemTime); 1960eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mForegroundTime); 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedUserTime); 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedSystemTime); 1964eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mLoadedForegroundTime); 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastUserTime); 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastSystemTime); 1968eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mLastForegroundTime); 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastStarts); 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedUserTime); 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedSystemTime); 1972eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mUnpluggedForegroundTime); 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime = in.readLong(); 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime = in.readLong(); 1979eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime = in.readLong(); 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedUserTime = in.readLong(); 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedSystemTime = in.readLong(); 1983eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mLoadedForegroundTime = in.readLong(); 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUserTime = in.readLong(); 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastSystemTime = in.readLong(); 1987eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mLastForegroundTime = in.readLong(); 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastStarts = in.readInt(); 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = in.readLong(); 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = in.readLong(); 1991eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = in.readLong(); 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCpuTimeLocked(int utime, int stime) { 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime += utime; 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime += stime; 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2004eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public void addForegroundTimeLocked(long ttime) { 2005eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime += ttime; 2006eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 2007eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incStartsLocked() { 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getUserTime(int which) { 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastUserTime; 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mUserTime; 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedUserTime; 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedUserTime; 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSystemTime(int which) { 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastSystemTime; 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mSystemTime; 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedSystemTime; 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedSystemTime; 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2045eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public long getForegroundTime(int which) { 2046eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long val; 2047eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_LAST) { 2048eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mLastForegroundTime; 2049eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } else { 2050eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mForegroundTime; 2051eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_CURRENT) { 2052eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mLoadedForegroundTime; 2053eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } else if (which == STATS_UNPLUGGED) { 2054eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mUnpluggedForegroundTime; 2055eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 2056eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 2057eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani return val; 2058eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 2059eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2060eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable { 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times this package has done something that could wake up the 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mWakeups; 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device loaded from a 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous save. 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedWakeups; 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastWakeups; 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedWakeups; 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statics we have collected for this package's services. 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>(); 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg() { 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = mWakeups; 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups = in.readInt(); 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedWakeups = in.readInt(); 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWakeups = in.readInt(); 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = in.readInt(); 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numServs = in.readInt(); 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.clear(); 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int m = 0; m < numServs; m++) { 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String serviceName = in.readString(); 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = new Serv(); 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.put(serviceName, serv); 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.readFromParcelLocked(in); 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakeups); 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedWakeups); 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastWakeups); 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedWakeups); 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mServiceStats.size()); 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) { 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(servEntry.getKey()); 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = servEntry.getValue(); 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.writeToParcelLocked(out); 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() { 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServiceStats; 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWakeups(int which) { 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastWakeups; 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mWakeups; 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedWakeups; 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedWakeups; 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable { 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left started. 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartTime; 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been started and not yet stopped, this is 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started. 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRunningSince; 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently running. 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning; 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number of times startService() has been called. 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left launched. 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedTime; 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been launched and not yet exited, this is 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was launched (ms in battery uptime). 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedSince; 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently launched. 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLaunched; 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number times the service has been launched. 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLaunches; 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started loaded from a previous save 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (ms in battery uptime). 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedStartTime; 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts loaded from a previous save. 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches loaded from a previous save. 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedLaunches; 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started as of the last run (ms 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastStartTime; 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts as of the last run. 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches as of the last run. 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastLaunches; 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started when last unplugged (ms 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedStartTime; 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts when last unplugged. 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches when last unplugged. 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedLaunches; 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Serv() { 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime); 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = mLaunches; 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime = in.readLong(); 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = in.readLong(); 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = in.readInt() != 0; 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime = in.readLong(); 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = in.readLong(); 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = in.readInt() != 0; 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches = in.readInt(); 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStartTime = in.readLong(); 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedLaunches = in.readInt(); 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastStartTime = in.readLong(); 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastStarts = in.readInt(); 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastLaunches = in.readInt(); 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = in.readLong(); 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = in.readInt(); 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mStartTime); 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRunningSince); 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mRunning ? 1 : 0); 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedTime); 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedSince); 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunched ? 1 : 0); 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunches); 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedStartTime); 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedLaunches); 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastStartTime); 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastStarts); 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastLaunches); 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedStartTime); 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedLaunches); 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getLaunchTimeToNowLocked(long batteryUptime) { 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) return mLaunchedTime; 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLaunchedTime + batteryUptime - mLaunchedSince; 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getStartTimeToNowLocked(long batteryUptime) { 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) return mStartTime; 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartTime + batteryUptime - mRunningSince; 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLaunchedLocked() { 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) { 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches++; 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = getBatteryUptimeLocked(); 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = true; 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopLaunchedLocked() { 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLaunched) { 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mLaunchedSince; 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime += time; 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches--; 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = false; 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startRunningLocked() { 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) { 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = getBatteryUptimeLocked(); 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopRunningLocked() { 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRunning) { 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mRunningSince; 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime += time; 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts--; 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = false; 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLaunches(int which) { 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastLaunches; 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLaunches; 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedLaunches; 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedLaunches; 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getStartTime(long now, int which) { 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStartTime; 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = getStartTimeToNowLocked(now); 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStartTime; 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStartTime; 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incWakeupsLocked() { 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups++; 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Serv newServiceStatsLocked() { 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Serv(); 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Proc getProcessStatsLocked(String name) { 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc ps = mProcessStats.get(name); 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Proc(); 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(name, ps); 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg getPackageStatsLocked(String name) { 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = mPackageStats.get(name); 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Pkg(); 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(name, ps); 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg.Serv getServiceStatsLocked(String pkg, String serv) { 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = getPackageStatsLocked(pkg); 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg.Serv ss = ps.mServiceStats.get(serv); 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ss == null) { 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss = ps.newServiceStatsLocked(); 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps.mServiceStats.put(serv, ss); 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2485c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getWakeTimerLocked(String name, int type) { 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Wakelock wl = mWakelockStats.get(name); 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl == null) { 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl = new Wakelock(); 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.put(name, wl); 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = null; 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerPartial; 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 2496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(WAKE_TYPE_PARTIAL, mPartialTimers, mUnpluggables); 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial = t; 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerFull; 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 2503c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(WAKE_TYPE_FULL, mFullTimers, mUnpluggables); 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull = t; 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerWindow; 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 2510c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(WAKE_TYPE_WINDOW, mWindowTimers, mUnpluggables); 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow = t; 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("type=" + type); 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) { 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sensor se = mSensorStats.get(sensor); 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se == null) { 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!create) { 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se = new Sensor(sensor); 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensor, se); 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = se.mTimer; 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2532c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor); 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timers == null) { 2534c64edde69d18498fb2954f71a546357b07ab996aEvan Millar timers = new ArrayList<StopwatchTimer>(); 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(sensor, timers); 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(BatteryStats.SENSOR, timers, mUnpluggables); 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer = t; 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartWakeLocked(String name, int type) { 2543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopWakeLocked(String name, int type) { 2550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int sensor) { 2557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, true); 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int sensor) { 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't create a timer if one doesn't already exist 2565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, false); 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps() { 2572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true); 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps() { 2579c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false); 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 2582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(String filename) { 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile = new File(filename); 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackupFile = new File(filename + ".bak"); 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 2594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables); 2595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 2596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables); 2597617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2598617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables); 2599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables); 2600627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 2601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables); 2602627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2603627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 2604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables); 2605627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiOnTimer = new StopwatchTimer(-3, null, mUnpluggables); 2607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiRunningTimer = new StopwatchTimer(-4, null, mUnpluggables); 2608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mBluetoothOnTimer = new StopwatchTimer(-5, null, mUnpluggables); 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = false; 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = 0; 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = 0; 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 2616633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = 0; 2617633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = 0; 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(Parcel p) { 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile = mBackupFile = null; 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcel(p); 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStartCount() { 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartCount; 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2634105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void setOnBattery(boolean onBattery, int level) { 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 2636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar updateKernelWakelocksLocked(); 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBattery != onBattery) { 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = onBattery; 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long uptime = SystemClock.uptimeMillis() * 1000; 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSecRealtime = SystemClock.elapsedRealtime(); 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long realtime = mSecRealtime * 1000; 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (onBattery) { 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = uptime; 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = realtime; 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime); 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime); 2648633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = mDischargeStartLevel = level; 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doUnplug(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime); 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; 2653633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = level; 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doPlug(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mLastWriteTime + (60 * 1000)) < mSecRealtime) { 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFile != null) { 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLocked(); 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2664633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 2665633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public void recordCurrentLevel(int level) { 2666633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = level; 2667633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 2668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateKernelWakelocksLocked() { 2670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = readKernelWakelockStats(); 2671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2672d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen if (m == null) { 2673d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen // Not crashing might make board bringup easier. 2674d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen Log.w(TAG, "Couldn't get kernel wake lock stats"); 2675d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen return; 2676d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen } 2677d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen 2678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) { 2679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name = ent.getKey(); 2680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kws = ent.getValue(); 2681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 2683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 2684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 2685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 2686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 2687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedCount(kws.mCount); 2689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); 2690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.setUpdateVersion(sKernelWakelockUpdateVersion); 2691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != mKernelWakelockStats.size()) { 2694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Set timers to stale if they didn't appear in /proc/wakelocks this time. 2695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 2696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer st = ent.getValue(); 2697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) { 2698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar st.setStale(); 2699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); 27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery(); 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeUptime(long curTime, int which) { 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: return mUptime + (curTime-mUptimeStart); 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastUptime; 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mUptimeStart); 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart); 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeRealtime(long curTime, int which) { 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart); 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastRealtime; 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mRealtimeStart); 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart); 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryUptime(long curTime, int which) { 27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryUptime + getBatteryUptime(curTime); 27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastUptime; 27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(curTime); 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime; 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryRealtime(long curTime, int which) { 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryRealtime + getBatteryRealtimeLocked(curTime); 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastRealtime; 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime; 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked(long curTime) { 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastUptime; 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryUptimeStart; 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked() { 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(SystemClock.uptimeMillis() * 1000); 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryUptime(long curTime) { 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime); 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryRealtimeLocked(long curTime) { 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastRealtime; 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryRealtimeStart; 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryRealtime(long curTime) { 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 27943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long getTcpBytes(long current, long[] dataBytes, int which) { 27953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (which == STATS_LAST) { 27963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 27973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 27983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (which == STATS_UNPLUGGED) { 27993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (dataBytes[STATS_UNPLUGGED] < 0) { 28003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 28013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 28023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return current - dataBytes[STATS_UNPLUGGED]; 28033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 28043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else if (which == STATS_TOTAL) { 28053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_TOTAL]; 28063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 28073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return current - dataBytes[STATS_CURRENT]; 28083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 28093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 28103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 28113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 28123718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesSent(int which) { 28133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return getTcpBytes(NetStat.getMobileTxBytes(), mMobileDataTx, which); 28143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 28153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 28163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 28173718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesReceived(int which) { 28183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return getTcpBytes(NetStat.getMobileRxBytes(), mMobileDataRx, which); 28193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 28203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 28213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 28223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesSent(int which) { 28233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return getTcpBytes(NetStat.getTotalTxBytes(), mTotalDataTx, which); 28243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 28253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 28263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 28273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesReceived(int which) { 28283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return getTcpBytes(NetStat.getTotalRxBytes(), mTotalDataRx, which); 28293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 28303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2831105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2832633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevel() { 2833105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 2834633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeStartLevelLocked(); 2835105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2836105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2837105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2838633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevelLocked() { 2839633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return mDischargeStartLevel; 2840105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2841105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2842105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2843633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevel() { 2844105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 2845633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeCurrentLevelLocked(); 2846105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2847105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2848105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2849633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevelLocked() { 2850633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return mDischargeCurrentLevel; 2851105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular uid, creating if needed. 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid getUidStatsLocked(int uid) { 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.get(uid); 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u == null) { 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u = new Uid(uid); 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u; 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the statistics object for a particular uid. 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeUidStatsLocked(int uid) { 28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.remove(uid); 28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 287132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Proc getProcessStatsLocked(int uid, String name) { 28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getProcessStatsLocked(name); 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 288232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * Retrieve the statistics object for a particular process, given 288332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * the name of the process. 288432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @param name process name 288532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @return the statistics object for the process 288632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani */ 2887819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani public Uid.Proc getProcessStatsLocked(String name, int pid) { 288832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani int uid; 288932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani if (mUidCache.containsKey(name)) { 289032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani uid = mUidCache.get(name); 289132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } else { 2892819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani uid = Process.getUidForPid(pid); 289332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mUidCache.put(name, uid); 289432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 289532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani Uid u = getUidStatsLocked(uid); 289632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return u.getProcessStatsLocked(name); 289732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 289832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 289932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani /** 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg getPackageStatsLocked(int uid, String pkg) { 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getPackageStatsLocked(pkg); 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) { 29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getServiceStatsLocked(pkg, name); 29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeLocked() { 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mFile == null) || (mBackupFile == null)) { 29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BatteryStats", "writeLocked: no file associated with this instance"); 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Keep the old file around until we know the new one has 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // been successfully written. 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFile.exists()) { 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBackupFile.exists()) { 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackupFile.delete(); 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile.renameTo(mBackupFile); 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream stream = new FileOutputStream(mFile); 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeSummaryToParcel(out); 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.write(out.marshall()); 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.flush(); 29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackupFile.delete(); 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = SystemClock.elapsedRealtime(); 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("BatteryStats", "Error writing battery statistics", e); 29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static byte[] readFully(FileInputStream stream) throws java.io.IOException { 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int avail = stream.available(); 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[avail]; 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int amt = stream.read(data, pos, data.length-pos); 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "Read " + amt + " bytes at " + pos 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " of avail " + data.length); 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt <= 0) { 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "**** FINISHED READING: pos=" + pos 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " len=" + data.length); 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos += amt; 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project avail = stream.available(); 29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (avail > data.length-pos) { 29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] newData = new byte[pos+avail]; 29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(data, 0, newData, 0, pos); 29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = newData; 29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readLocked() { 29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mFile == null) || (mBackupFile == null)) { 29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BatteryStats", "readLocked: no file associated with this instance"); 29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileInputStream stream = null; 29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBackupFile.exists()) { 29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream = new FileInputStream(mBackupFile); 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (java.io.IOException e) { 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We'll try for the normal settings file. 29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stream == null) { 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mFile.exists()) { 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream = new FileInputStream(mFile); 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] raw = readFully(stream); 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in = Parcel.obtain(); 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.unmarshall(raw, 0, raw.length); 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.setDataPosition(0); 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSummaryFromParcel(in); 30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(java.io.IOException e) { 30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("BatteryStats", "Error reading battery statistics", e); 30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSummaryFromParcel(Parcel in) { 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int version = in.readInt(); 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (version != VERSION) { 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BatteryStats", "readFromParcel: version got " + version 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", expected " + VERSION + "; erasing old stats"); 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastUptime = in.readLong(); 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastRealtime = in.readLong(); 30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUptime = in.readLong(); 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastRealtime = in.readLong(); 3030633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = in.readInt(); 3031633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 3032105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.readSummaryFromParcelLocked(in); 3037617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3038617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); 3039617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3040617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.readSummaryFromParcelLocked(in); 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.readSummaryFromParcelLocked(in); 3043627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3044627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in); 3045627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3046627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3047627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in); 3048627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3049105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 3050105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.readSummaryFromParcelLocked(in); 3051d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 3052d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.readSummaryFromParcelLocked(in); 3053105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 3054105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.readSummaryFromParcelLocked(in); 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3056c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 3057c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 3058c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 3059c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String kwltName = in.readString(); 3060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in); 3061c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3063c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = in.readInt(); 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3070617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOn = false; 3071617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in); 3072105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockOut = false; 3073105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); 3074244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mAudioTurnedOn = false; 3075244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in); 3076244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mVideoTurnedOn = false; 3077244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in); 3078105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockOut = false; 3079105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); 30805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastEnabled = false; 30815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastTimer.readSummaryFromParcelLocked(in); 30825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 3083617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() != 0) { 3084617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 3085617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.initUserActivityLocked(); 3086617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3087617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 3088617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); 3089617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3090617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3091617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = in.readInt(); 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iw = 0; iw < NW; iw++) { 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wlName = in.readString(); 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in); 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in); 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in); 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = in.readInt(); 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NP; is++) { 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int seNumber = in.readInt(); 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getSensorTimerLocked(seNumber, true) 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .readSummaryFromParcelLocked(in); 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String procName = in.readString(); 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc p = u.getProcessStatsLocked(procName); 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mUserTime = p.mLoadedUserTime = in.readLong(); 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastUserTime = in.readLong(); 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mSystemTime = p.mLoadedSystemTime = in.readLong(); 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastSystemTime = in.readLong(); 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStarts = p.mLoadedStarts = in.readInt(); 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastStarts = in.readInt(); 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = in.readString(); 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg p = u.getPackageStatsLocked(pkgName); 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mWakeups = p.mLoadedWakeups = in.readInt(); 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastWakeups = in.readInt(); 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = in.readInt(); 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NS; is++) { 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String servName = in.readString(); 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStartTime = s.mLoadedStartTime = in.readLong(); 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastStartTime = in.readLong(); 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStarts = s.mLoadedStarts = in.readInt(); 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastStarts = in.readInt(); 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLaunches = s.mLoadedLaunches = in.readInt(); 31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastLaunches = in.readInt(); 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesReceived = in.readLong(); 31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesSent = in.readLong(); 31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a summary of the statistics to a Parcel, in a format suitable to be written to 31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disk. This format does not allow a lossless round-trip. 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeSummaryToParcel(Parcel out) { 31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW_SYS = SystemClock.uptimeMillis() * 1000; 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000; 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW = getBatteryUptimeLocked(NOW_SYS); 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS); 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(VERSION); 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL)); 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT)); 31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL)); 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT)); 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL)); 31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT)); 31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL)); 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT)); 3174633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeStartLevel); 3175633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 3176105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3179617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3180617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 3181617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3182617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeSummaryFromParcelLocked(out); 31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3184627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3185627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 3186627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3187627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3188627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 3189627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3190105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3191d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3192105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 3195c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 3196c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer kwlt = ent.getValue(); 3197c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 3198c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 3199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 3200c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL); 3201c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 3202c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 3203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3204c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3205c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = mUidStats.size(); 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NU); 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(iu)); 32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 3211105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 3212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3213105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3214c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3215c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3216105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 32175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL); 32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 3220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 3221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 3222617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 3223617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 3224617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); 3225617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3226617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = u.mWakelockStats.size(); 32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NW); 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mWakelockStats.entrySet()) { 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerFull != null) { 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL); 32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerPartial != null) { 32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL); 32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerWindow != null) { 32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL); 32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NSE = u.mSensorStats.size(); 32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NSE); 32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NSE > 0) { 32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent 32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mSensorStats.entrySet()) { 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ent.getKey()); 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se.mTimer != null) { 32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL); 32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = u.mProcessStats.size(); 32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent 32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mProcessStats.entrySet()) { 32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime); 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime - ps.mLoadedUserTime); 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime); 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime); 32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts); 32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts - ps.mLoadedStarts); 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = u.mPackageStats.size(); 32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent 32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mPackageStats.entrySet()) { 32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups); 32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups - ps.mLoadedWakeups); 32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = ps.mServiceStats.size(); 32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NS); 32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NS > 0) { 33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent 33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : ps.mServiceStats.entrySet()) { 33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(sent.getKey()); 33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue(); 33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = ss.getStartTimeToNowLocked(NOW); 33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time); 33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time - ss.mLoadedStartTime); 33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts); 33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts - ss.mLoadedStarts); 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches); 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches - ss.mLoadedLaunches); 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(u.getTcpBytesReceived(STATS_TOTAL)); 33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(u.getTcpBytesSent(STATS_TOTAL)); 33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readFromParcel(Parcel in) { 33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcelLocked(in); 33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = in.readInt(); 33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != MAGIC) { 33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ParcelFormatException("Bad magic number"); 33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastUptime = in.readLong(); 33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastRealtime = in.readLong(); 33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 3337c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables, in); 3338617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3339c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables, in); 3340617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables, in); 33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 3343c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 3344627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3345c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables, in); 3346627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3347627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3348c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables, in); 3349627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3350105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 3351c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 3352d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 3353c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiRunningTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 3354105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 3355c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mBluetoothOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = in.readLong(); 33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUptime = in.readLong(); 33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = in.readLong(); 33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastRealtime = in.readLong(); 33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = in.readInt() != 0; 33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBatteryInternal = false; // we are no longer really running. 33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = in.readLong(); 33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = in.readLong(); 33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = in.readLong(); 33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = in.readLong(); 33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = in.readLong(); 33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = in.readLong(); 3370633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = in.readInt(); 3371633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = in.readLong(); 33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataRx[STATS_LAST] = in.readLong(); 33753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataRx[STATS_UNPLUGGED] = -1; 33763718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataTx[STATS_LAST] = in.readLong(); 33773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataTx[STATS_UNPLUGGED] = -1; 33783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataRx[STATS_LAST] = in.readLong(); 33793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataRx[STATS_UNPLUGGED] = -1; 33803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataTx[STATS_LAST] = in.readLong(); 33813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataTx[STATS_UNPLUGGED] = -1; 33823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 33833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = in.readLong(); 33843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 33853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 33863f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = in.readInt(); 33873f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 33883f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 3389c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.clear(); 3390c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 3391c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 3392c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 3393c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String wakelockName = in.readString(); 3394244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel 3395c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); 3396c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(wakelockName, kwlt); 3397c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3398c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3399c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers.clear(); 34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers.clear(); 34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers.clear(); 34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numUids = in.readInt(); 34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numUids; i++) { 34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.readFromParcelLocked(mUnpluggables, in); 34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.append(uid, u); 34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeToParcelLocked(out, flags); 34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, int flags) { 34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecUptime = SystemClock.uptimeMillis() * 1000; 34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptimeLocked(uSecUptime); 34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(MAGIC); 34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryUptime); 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryLastUptime); 34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryRealtime); 34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryLastRealtime); 34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeToParcel(out, batteryRealtime); 3432617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime); 3434617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3435617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeToParcel(out); 34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeToParcel(out, batteryRealtime); 3437627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3438627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime); 3439627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3440627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3441627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime); 3442627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeToParcel(out, batteryRealtime); 3444d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.writeToParcel(out, batteryRealtime); 3445105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeToParcel(out, batteryRealtime); 34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptime); 34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptimeStart); 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastUptime); 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtime); 34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtimeStart); 34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastRealtime); 34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mOnBattery ? 1 : 0); 34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryUptime); 34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryUptimeStart); 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryRealtime); 34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryRealtimeStart); 34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryUptime); 34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryRealtime); 3459633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeStartLevel); 3460633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastWriteTime); 34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani out.writeLong(getMobileTcpBytesReceived(STATS_UNPLUGGED)); 34643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani out.writeLong(getMobileTcpBytesSent(STATS_UNPLUGGED)); 34653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani out.writeLong(getTotalTcpBytesReceived(STATS_UNPLUGGED)); 34663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani out.writeLong(getTotalTcpBytesSent(STATS_UNPLUGGED)); 34673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 34683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Write radio uptime for data 34693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeLong(getRadioDataUptime()); 34703f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 34713f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeInt(getBluetoothPingCount()); 34723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 3473c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 3474c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 3475c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = ent.getValue(); 3476c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 3477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 3478c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 3479c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer.writeTimerToParcel(out, kwlt, batteryRealtime); 3480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 3481c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 3482c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3483c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = mUidStats.size(); 34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(size); 34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < size; i++) { 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(i)); 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid uid = mUidStats.valueAt(i); 34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid.writeToParcelLocked(out, batteryRealtime); 34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<BatteryStatsImpl> CREATOR = 34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<BatteryStatsImpl>() { 34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl createFromParcel(Parcel in) { 34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl(in); 34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl[] newArray(int size) { 35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl[size]; 35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void dumpLocked(PrintWriter pw) { 35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) { 35081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 35091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen timer:"); 35101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenOnTimer.logState(pr, " "); 3511617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 35121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen brightness #" + i + ":"); 35131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenBrightnessTimer[i].logState(pr, " "); 3514617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 35151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Input event counter:"); 35161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mInputEventCounter.logState(pr, " "); 35171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Phone timer:"); 35181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneOnTimer.logState(pr, " "); 3519627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 35201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Signal strength #" + i + ":"); 35211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneSignalStrengthsTimer[i].logState(pr, " "); 3522627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3523627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 35241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Data connection type #" + i + ":"); 35251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneDataConnectionsTimer[i].logState(pr, " "); 35261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 35271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Wifi timer:"); 35281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiOnTimer.logState(pr, " "); 35291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** WifiRunning timer:"); 35301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiRunningTimer.logState(pr, " "); 35311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Bluetooth timer:"); 35321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mBluetoothOnTimer.logState(pr, " "); 35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dumpLocked(pw); 35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3537