BatteryStatsImpl.java revision 1fadab5c36445bb9f0997904dbce44f8e234f847
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 191afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport com.android.internal.util.JournaledFile; 201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn 213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothDevice; 223f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset; 231719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriffimport android.net.TrafficStats; 246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackbornimport android.os.BatteryManager; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats; 268bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils; 270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Handler; 280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Message; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 32c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 35f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState; 36e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 37627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackbornimport android.util.LogWriter; 401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 421afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport android.util.Slog; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 54c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator; 555a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganeshimport java.util.List; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 574cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger; 58ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackbornimport java.util.concurrent.locks.ReentrantLock; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. All times are represented in microseconds except where indicated 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "BatteryStatsImpl"; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG = false; 6832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn private static final boolean DEBUG_HISTORY = false; 695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh private static final int MAGIC = 0xBA757475; // 'BATSTATS' 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Current on-disk Parcel version 741fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn private static final int VERSION = 60; 75e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // Maximum number of items we will record in the history. 777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private static final int MAX_HISTORY_ITEMS = 2000; 785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 79f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // No, really, THIS is the maximum number of items we will record in the history. 80f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn private static final int MAX_MAX_HISTORY_ITEMS = 3000; 81f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 829e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // The maximum number of names wakelocks we will keep track of 839e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // per uid; once the limit is reached, we batch the remaining wakelocks 849e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // in to one common name. 857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private static final int MAX_WAKELOCKS_PER_UID = 30; 865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 879e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn private static final String BATCHED_WAKELOCK_NAME = "*overflow*"; 885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 89e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani private static int sNumSpeedSteps; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 911afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn private final JournaledFile mFile; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn static final int MSG_UPDATE_WAKELOCKS = 1; 940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn static final int MSG_REPORT_POWER_CHANGE = 2; 95287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final long DELAY_UPDATE_WAKELOCKS = 5*1000; 960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public interface BatteryCallback { 980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void batteryNeedsCpuUpdate(); 990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void batteryPowerChanged(boolean onBattery); 1000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final class MyHandler extends Handler { 1030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn @Override 1040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void handleMessage(Message msg) { 1050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn BatteryCallback cb = mCallback; 1060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn switch (msg.what) { 1070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn case MSG_UPDATE_WAKELOCKS: 1080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (cb != null) { 1090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn cb.batteryNeedsCpuUpdate(); 1100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn break; 1120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn case MSG_REPORT_POWER_CHANGE: 1130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (cb != null) { 1140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn cb.batteryPowerChanged(msg.arg1 != 0); 1150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn break; 1170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn private final MyHandler mHandler; 1220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn private BatteryCallback mCallback; 1240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected organized by uids. 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SparseArray<BatteryStatsImpl.Uid> mUidStats = 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SparseArray<BatteryStatsImpl.Uid>(); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A set of pools of currently active timers. When a timer is queried, we will divide the 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // elapsed time by the number of active timers to arrive at that timer's share of the time. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In order to do this, we must refresh each timer whenever the number of active timers 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes. 135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>(); 136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>(); 137c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>(); 138c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers 139c64edde69d18498fb2954f71a546357b07ab996aEvan Millar = new SparseArray<ArrayList<StopwatchTimer>>(); 14058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>(); 14158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>(); 14258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mScanWifiLockTimers = new ArrayList<StopwatchTimer>(); 14358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>(); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // Last partial timers we use for distributing CPU usage. 1460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>(); 1470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are the objects that will want to do something when the device 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is unplugged from power. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>(); 1515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mShuttingDown; 1535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long mHistoryBaseTime; 1556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mHaveBatteryLevel = false; 1566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mRecordingHistory = true; 1576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int mNumHistoryItems; 1580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1591fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int MAX_HISTORY_BUFFER = 128*1024; // 128KB 1601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int MAX_MAX_HISTORY_BUFFER = 144*1024; // 144KB 1610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final Parcel mHistoryBuffer = Parcel.obtain(); 1620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final HistoryItem mHistoryLastWritten = new HistoryItem(); 1630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final HistoryItem mHistoryLastLastWritten = new HistoryItem(); 1641fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final HistoryItem mHistoryReadTmp = new HistoryItem(); 1650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int mHistoryBufferLastPos = -1; 1660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean mHistoryOverflow = false; 1670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long mLastHistoryTime = 0; 1680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final HistoryItem mHistoryCur = new HistoryItem(); 1700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistory; 1726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistoryEnd; 1739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn HistoryItem mHistoryLastEnd; 1746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistoryCache; 1750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private HistoryItem mHistoryIterator; 1770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private boolean mReadOverflow; 1780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private boolean mIteratingHistory; 1795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStartCount; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryUptime; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastUptime; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryRealtime; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastRealtime; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptime; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptimeStart; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUptime; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtime; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtimeStart; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastRealtime; 1935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mScreenOn; 195c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScreenOnTimer; 1963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 197617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mScreenBrightnessBin = -1; 198c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; 1995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 200617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter mInputEventCounter; 2015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mPhoneOn; 203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mPhoneOnTimer; 2045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 205244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioOn; 206244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioOnTimer; 2075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 208244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoOn; 209244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoOnTimer; 2105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 211627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneSignalStrengthBin = -1; 212e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int mPhoneSignalStrengthBinRaw = -1; 213c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneSignalStrengthsTimer = 2145284090631e638b916d9a453212e9dc802656a67Wink Saville new StopwatchTimer[SignalStrength.NUM_SIGNAL_STRENGTH_BINS]; 215f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 216f37447bad3773b62176baa837908daf6edb44273Amith Yamasani StopwatchTimer mPhoneSignalScanningTimer; 217f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 218627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneDataConnectionType = -1; 2195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh final StopwatchTimer[] mPhoneDataConnectionsTimer = 220c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_DATA_CONNECTION_TYPES]; 2215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 222105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mWifiOn; 223c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiOnTimer; 224617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mWifiOnUid = -1; 225d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 22658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn boolean mGlobalWifiRunning; 22758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn StopwatchTimer mGlobalWifiRunningTimer; 2285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 229105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mBluetoothOn; 230c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mBluetoothOnTimer; 2313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 2323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** Bluetooth headset object */ 2333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani BluetoothHeadset mBtHeadset; 2343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These provide time bases that discount the time the device is plugged 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in to power. 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBattery; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBatteryInternal; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastUptime; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryUptimeStart; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastRealtime; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryRealtimeStart; 2453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryUptime; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryRealtime; 2483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 249105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /* 250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * These keep track of battery levels (1-100) at the last plug event and the last unplug event. 251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 252633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeStartLevel; 2536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int mDischargeUnplugLevel; 254633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeCurrentLevel; 2553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int mLowDischargeAmountSinceCharge; 2563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int mHighDischargeAmountSinceCharge; 257c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeScreenOnUnplugLevel; 258c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeScreenOffUnplugLevel; 259c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOn; 260c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOnSinceCharge; 261c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOff; 262c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOffSinceCharge; 263244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastWriteTime = 0; // Milliseconds 265244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Mobile data transferred while on battery 2673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataTx = new long[4]; 2683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataRx = new long[4]; 2693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataTx = new long[4]; 2703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataRx = new long[4]; 2713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataUptime; 2733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataStart; 2743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingCount; 2763f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingStart = -1; 2773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 278f37447bad3773b62176baa837908daf6edb44273Amith Yamasani private int mPhoneServiceState = -1; 279e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private int mPhoneServiceStateRaw = -1; 280e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private int mPhoneSimStateRaw = -1; 281f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 282c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 283c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Holds a SamplingTimer associated with each kernel wakelock name being tracked. 284c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 2855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh private final HashMap<String, SamplingTimer> mKernelWakelockStats = 286c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, SamplingTimer>(); 2875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 288c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public Map<String, ? extends SamplingTimer> getKernelWakelockStats() { 289c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mKernelWakelockStats; 290c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 292c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static int sKernelWakelockUpdateVersion = 0; 2935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 294c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static final int[] PROC_WAKELOCKS_FORMAT = new int[] { 295c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_STRING, // 0: name 296c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 1: count 297c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 298c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 299c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 300c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 5: totalTime 301c64edde69d18498fb2954f71a546357b07ab996aEvan Millar }; 3025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 303c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final String[] mProcWakelocksName = new String[3]; 304c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final long[] mProcWakelocksData = new long[3]; 3055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 306c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 307c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added 308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * to mKernelWakelockStats. 309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 3105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh private final Map<String, KernelWakelockStats> mProcWakelockFileStats = 311c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, KernelWakelockStats>(); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>(); 3145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For debugging 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl() { 3171afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 3180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = null; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface Unpluggable { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unplug(long batteryUptime, long batteryRealtime); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void plug(long batteryUptime, long batteryRealtime); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 327617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * State for keeping track of counting information. 328617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 329e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class Counter extends BatteryStats.Counter implements Unpluggable { 3304cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate final AtomicInteger mCount = new AtomicInteger(); 3316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn final ArrayList<Unpluggable> mUnpluggables; 332617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLoadedCount; 333617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLastCount; 334617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mUnpluggedCount; 335617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mPluggedCount; 3365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 337617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables, Parcel in) { 3386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 3394cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = in.readInt(); 3404cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLoadedCount = in.readInt(); 3423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 343617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = in.readInt(); 344617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 345617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 346617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables) { 3486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 349617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void writeToParcel(Parcel out) { 3534cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(mCount.get()); 354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLoadedCount); 355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mUnpluggedCount); 356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 358617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void unplug(long batteryUptime, long batteryRealtime) { 3594cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount; 3604cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 361617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 362617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void plug(long batteryUptime, long batteryRealtime) { 3644cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = mCount.get(); 365617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 367617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * Writes a possibly null Counter to a Parcel. 369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param out the Parcel to be written to. 371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param counter a Counter, or null. 372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 373617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static void writeCounterToParcel(Parcel out, Counter counter) { 374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (counter == null) { 375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); // indicates null 376617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return; 377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); // indicates non-null 379617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 380617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn counter.writeToParcel(out); 381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 384c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 385617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int val; 386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_LAST) { 387617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val = mLastCount; 388617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 3894cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate val = mCount.get(); 3906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 391617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mUnpluggedCount; 3926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 393617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mLoadedCount; 394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return val; 398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 399617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 400617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void logState(Printer pw, String prefix) { 4014cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate pw.println(prefix + "mCount=" + mCount.get() 402617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 403617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mUnpluggedCount=" + mUnpluggedCount 404617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mPluggedCount=" + mPluggedCount); 405617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4074cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate void stepAtomic() { 4084cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.incrementAndGet(); 409617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 410617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 4116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 4126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear state of this counter. 4136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 4146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void reset(boolean detachIfReset) { 4156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCount.set(0); 4166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0; 4176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (detachIfReset) { 4186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn detach(); 4196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 4236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 4246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void writeSummaryFromParcelLocked(Parcel out) { 4274cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate int count = mCount.get(); 4284cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(count); 429617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 430617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void readSummaryFromParcelLocked(Parcel in) { 4324cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mLoadedCount = in.readInt(); 4334cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mLoadedCount); 4343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 4354cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount = mLoadedCount; 436617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 437617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 438e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 439e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class SamplingCounter extends Counter { 440e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 441e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) { 442e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables, in); 443e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 444e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 445e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables) { 446e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables); 447e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 448e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 4494cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void addCountAtomic(long count) { 4504cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.addAndGet((int)count); 451e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 452e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 453e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 454617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for keeping track of timing information. 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static abstract class Timer extends BatteryStats.Timer implements Unpluggable { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mType; 4596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn final ArrayList<Unpluggable> mUnpluggables; 4605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedCount; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastCount; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedCount; 4655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Times are in microseconds for better accuracy when dividing by the 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock count, and are in "battery realtime" units. 4685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we have accumulated since the start of the original 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * boot, to the last time something interesting happened in the 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current run. 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTotalTime; 4755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we loaded for the previous runs. Subtract this from 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mTotalTime to find the time for the current run of the system. 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTime; 4815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The run time of the last run of the system, as loaded from the 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved data. 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastTime; 4875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value of mTotalTime when unplug() was last called. Subtract 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this from mTotalTime to find the time since the last unplug from 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * power. 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedTime; 4945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 495244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani /** 496244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * Constructs from a parcel. 497244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param type 498244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param unpluggables 499244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param powerType 500244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param in 501244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani */ 502c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 5046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 5055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount = in.readInt(); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedCount = in.readInt(); 5083bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = in.readInt(); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = in.readLong(); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTime = in.readLong(); 5123bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastTime = 0; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = in.readLong(); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 517c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables) { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 5196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract long computeRunTimeLocked(long curBatteryRealtime); 5245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract int computeCurrentCountLocked(); 5265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 5286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear state of this timer. Returns true if the timer is inactive 5296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * so can be completely dropped. 5306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 5319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 5326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalTime = mLoadedTime = mLastTime = 0; 5336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCount = mLoadedCount = mLastCount = 0; 5346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (detachIfReset) { 5356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn detach(); 5366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 5386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 5416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 5426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, long batteryRealtime) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mCount); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedCount); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedCount); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRunTimeLocked(batteryRealtime)); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTime); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedTime); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedTime=" + mUnpluggedTime 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedCount=" + mUnpluggedCount); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = computeRunTimeLocked(batteryRealtime); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = mCount; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": new mUnpluggedTime=" + mUnpluggedTime 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new mUnpluggedCount=" + mUnpluggedCount); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 569c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime 571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " old mTotalTime=" + mTotalTime); 572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = computeRunTimeLocked(batteryRealtime); 574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = computeCurrentCountLocked(); 575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType 577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + ": new mTotalTime=" + mTotalTime); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a possibly null Timer to a Parcel. 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer, or null. 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void writeTimerToParcel(Parcel out, Timer timer, 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer == null) { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); // indicates null 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); // indicates non-null 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timer.writeToParcel(out, batteryRealtime); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long getTotalTimeLocked(long batteryRealtime, int which) { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastTime; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = computeRunTimeLocked(batteryRealtime); 6056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedTime; 6076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedTime; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastCount; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar val = computeCurrentCountLocked(); 6226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedCount; 6246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedCount; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 632627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void logState(Printer pw, String prefix) { 633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + " mCount=" + mCount 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedCount=" + mUnpluggedCount); 636627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mTotalTime=" + mTotalTime 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedTime=" + mLoadedTime); 638627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mLastTime=" + mLastTime 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedTime=" + mUnpluggedTime); 640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 6415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 6425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long runTime = computeRunTimeLocked(batteryRealtime); 645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Divide by 1000 for backwards compatibility 646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong((runTime + 500) / 1000); 647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount); 648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Multiply by 1000 for backwards compatibility 652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = mLoadedTime = in.readLong() * 1000; 6533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastTime = 0; 654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedTime = mTotalTime; 655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = mLoadedCount = in.readInt(); 6563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedCount = mCount; 658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 6605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class SamplingTimer extends Timer { 6625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported count from /proc/wakelocks. 665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mCurrentReportedCount; 667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported count from /proc/wakelocks when unplug() was last 670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUnpluggedReportedCount; 673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported total_time from /proc/wakelocks. 6765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh */ 677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mCurrentReportedTotalTime; 678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported total_time from /proc/wakelocks when unplug() was last 682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUnpluggedReportedTotalTime; 685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently in a discharge cycle. 688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mInDischarge; 690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently recording reported values. 693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mTrackingReportedValues; 6955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * A sequnce counter, incremented once for each update of the stats. 698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUpdateVersion; 7005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) { 702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables, in); 703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = in.readInt(); 704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = in.readInt(); 705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = in.readLong(); 706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = in.readLong(); 707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 7115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, 712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean trackReportedValues) { 713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables); 714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = trackReportedValues; 715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setStale() { 719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = false; 720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = 0; 721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = 0; 722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 724c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setUpdateVersion(int version) { 725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateVersion = version; 726c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getUpdateVersion() { 729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUpdateVersion; 730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedCount(int count) { 733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedCount == 0) { 734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = count; 736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = count; 740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedTotalTime(long totalTime) { 743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedTotalTime == 0) { 744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = totalTime; 746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = totalTime; 750c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 752c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void unplug(long batteryUptime, long batteryRealtime) { 753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.unplug(batteryUptime, batteryRealtime); 754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mTrackingReportedValues) { 755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime; 756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount; 757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = true; 759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 760c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = false; 764c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 7685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount 769c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedCount=" + mUnpluggedReportedCount 770c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime 771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime); 772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 7755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh return mTotalTime + (mInDischarge && mTrackingReportedValues 776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0); 777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount + (mInDischarge && mTrackingReportedValues 781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedCount - mUnpluggedReportedCount : 0); 782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mUnpluggedReportedCount); 788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUnpluggedReportedTotalTime); 790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 7939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 7949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.reset(stats, detachIfReset); 7956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn setStale(); 7966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 7976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 7985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeSummaryFromParcelLocked(out, batteryRealtime); 801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong(); 809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount = in.readInt(); 810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 8135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * State for keeping track of timing information. 816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class StopwatchTimer extends Timer { 8180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final Uid mUid; 819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mTimerPool; 8200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mNesting; 822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The last time at which we updated the timer. If mNesting is > 0, 825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * subtract this from the current battery time to find the amount of 826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * time we have been running since we last computed an update. 827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUpdateTime; 8295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 8319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn * The total time at which the timer was acquired, to determine if it 832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * was actually held for an interesting duration. 833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mAcquireTime; 835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 836f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long mTimeout; 837f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 8380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn /** 8390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn * For partial wake locks, keep track of whether we are in the list 8400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn * to consume CPU cycles. 8410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn */ 8420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn boolean mInList; 8430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 8440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool, 845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables, Parcel in) { 846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables, in); 8470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mUid = uid; 848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = in.readLong(); 850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 8520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool, 853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables) { 854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables); 8550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mUid = uid; 856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 8585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 859f37447bad3773b62176baa837908daf6edb44273Amith Yamasani void setTimeout(long timeout) { 860f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mTimeout = timeout; 861f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 862f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUpdateTime); 866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mNesting > 0) { 870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "old mUpdateTime=" + mUpdateTime); 872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = batteryRealtime; 875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "new mUpdateTime=" + mUpdateTime); 877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startRunningLocked(BatteryStatsImpl stats) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting++ == 0) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUpdateTime = stats.getBatteryRealtimeLocked( 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.elapsedRealtime() * 1000); 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all currently active timers before adding 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this new one to the pool. 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add this timer to the active pool 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.add(this); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Increment the count 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount++; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAcquireTime = mTotalTime; 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 90932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani boolean isRunningLocked() { 91032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return mNesting > 0; 91132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 91232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopRunningLocked(BatteryStatsImpl stats) { 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore attempt to stop a timer that isn't running 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting == 0) { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (--mNesting == 0) { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all active counters, scaled by the total 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // active in the pool, before taking this one out of the pool. 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove this timer from the active pool 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.remove(this); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh final long realtime = SystemClock.elapsedRealtime() * 1000; 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 1; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = computeRunTimeLocked(batteryRealtime); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTotalTime == mAcquireTime) { 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there was no change in the time, then discard this 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // count. A somewhat cheezy strategy, but hey. 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount--; 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update the total time for all other running Timers with the same type as this Timer 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // due to a change in timer count 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void refreshTimersLocked(final BatteryStatsImpl stats, 950c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> pool) { 9515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh final long realtime = SystemClock.elapsedRealtime() * 1000; 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = pool.size(); 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>= 0; i--) { 955c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer t = pool.get(i); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long heldTime = batteryRealtime - t.mUpdateTime; 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (heldTime > 0) { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mTotalTime += heldTime / N; 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mUpdateTime = batteryRealtime; 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 965c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 966f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) { 967f37447bad3773b62176baa837908daf6edb44273Amith Yamasani curBatteryRealtime = mUpdateTime + mTimeout; 968f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTotalTime + (mNesting > 0 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (curBatteryRealtime - mUpdateTime) 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project / (mTimerPool != null ? mTimerPool.size() : 1) 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : 0); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 975c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 976c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 977c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount; 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 9816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean canDetach = mNesting <= 0; 9829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.reset(stats, canDetach && detachIfReset); 9839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mNesting > 0) { 9849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mUpdateTime = stats.getBatteryRealtimeLocked( 9859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn SystemClock.elapsedRealtime() * 1000); 9869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 9879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mAcquireTime = mTotalTime; 9886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return canDetach; 9896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 9905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 9916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 9926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn super.detach(); 9936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPool != null) { 9946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPool.remove(this); 9956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 9966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 9975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readSummaryFromParcelLocked(Parcel in) { 999c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1004c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> readKernelWakelockStats() { 10055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 10063372f2e259247810627fd22033406163284f4f64Johannes Carlsson byte[] buffer = new byte[8192]; 1007c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int len; 10085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1009c64edde69d18498fb2954f71a546357b07ab996aEvan Millar try { 1010c64edde69d18498fb2954f71a546357b07ab996aEvan Millar FileInputStream is = new FileInputStream("/proc/wakelocks"); 1011c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = is.read(buffer); 1012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar is.close(); 1013c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (len > 0) { 1015c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 1016c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i=0; i<len; i++) { 1017c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (buffer[i] == '\0') { 1018c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = i; 1019c64edde69d18498fb2954f71a546357b07ab996aEvan Millar break; 1020c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1021c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1022c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.FileNotFoundException e) { 1024c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 1025c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.IOException e) { 1026c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 1027c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 10285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1029c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return parseProcWakelocks(buffer, len); 1030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 10315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1032c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> parseProcWakelocks( 1033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] wlBuffer, int len) { 1034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name; 1035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count; 1036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long totalTime; 1037c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int startIndex, endIndex; 1038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int numUpdatedWlNames = 0; 1039c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Advance past the first line. 1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 1042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++); 1043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex = i + 1; 1044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar synchronized(this) { 1046c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = mProcWakelockFileStats; 10475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion++; 1049c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (endIndex < len) { 10505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh for (endIndex=startIndex; 10515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0'; 1052c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex++); 10533372f2e259247810627fd22033406163284f4f64Johannes Carlsson endIndex++; // endIndex is an exclusive upper bound. 10543372f2e259247810627fd22033406163284f4f64Johannes Carlsson // Don't go over the end of the buffer, Process.parseProcLine might 10553372f2e259247810627fd22033406163284f4f64Johannes Carlsson // write to wlBuffer[endIndex] 10563372f2e259247810627fd22033406163284f4f64Johannes Carlsson if (endIndex >= (len - 1) ) { 10573372f2e259247810627fd22033406163284f4f64Johannes Carlsson return m; 1058e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani } 1059c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String[] nameStringArray = mProcWakelocksName; 1061c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long[] wlData = mProcWakelocksData; 10622098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // Stomp out any bad characters since this is from a circular buffer 10632098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // A corruption is seen sometimes that results in the vm crashing 10642098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // This should prevent crashes and the line will probably fail to parse 10652098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani for (int j = startIndex; j < endIndex; j++) { 10662098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?'; 10672098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani } 106853b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex, 106953b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null); 10702098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani 1071c64edde69d18498fb2954f71a546357b07ab996aEvan Millar name = nameStringArray[0]; 1072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar count = (int) wlData[1]; 1073c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // convert nanoseconds to microseconds with rounding. 1074c64edde69d18498fb2954f71a546357b07ab996aEvan Millar totalTime = (wlData[2] + 500) / 1000; 1075c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 107653b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani if (parsed && name.length() > 0) { 1077c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (!m.containsKey(name)) { 10785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh m.put(name, new KernelWakelockStats(count, totalTime, 1079c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion)); 1080c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 1081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 1082c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kwlStats = m.get(name); 1083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlStats.mVersion == sKernelWakelockUpdateVersion) { 1084c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount += count; 1085c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime += totalTime; 1086c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 1087c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount = count; 1088c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime = totalTime; 1089c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mVersion = sKernelWakelockUpdateVersion; 1090c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 1091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 109353b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani } 1094c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex; 1095c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != numUpdatedWlNames) { 1098c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Don't report old data. 1099c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Iterator<KernelWakelockStats> itr = m.values().iterator(); 1100c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (itr.hasNext()) { 1101c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (itr.next().mVersion != sKernelWakelockUpdateVersion) { 1102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar itr.remove(); 1103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1106c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return m; 1107c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1108c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 11095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1110c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private class KernelWakelockStats { 1111c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mCount; 1112c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long mTotalTime; 1113c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mVersion; 11145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1115c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats(int count, long totalTime, int version) { 1116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = count; 1117c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = totalTime; 1118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mVersion = version; 1119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 11215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1122c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 11235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh * Get the KernelWakelockTimer associated with name, and create a new one if one 1124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * doesn't already exist. 1125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 1126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public SamplingTimer getKernelWakelockTimerLocked(String name) { 1127c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 1128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 11295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 1130c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 1131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 1132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return kwlt; 1134c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 11353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataPlug(long[] dataTransfer, long currentBytes) { 11376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_LAST] = dataTransfer[STATS_SINCE_UNPLUGGED]; 11386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_SINCE_UNPLUGGED] = -1; 11393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataUnplug(long[] dataTransfer, long currentBytes) { 11426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_SINCE_UNPLUGGED] = currentBytes; 11433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 11463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Radio uptime in microseconds when transferring data. This value is very approximate. 11473f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @return 11483f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 11493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private long getCurrentRadioDataUptime() { 11503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani try { 11513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms"); 11523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (!awakeTimeFile.exists()) return 0; 11533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile)); 11543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani String line = br.readLine(); 11553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani br.close(); 11563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return Long.parseLong(line) * 1000; 11573718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (NumberFormatException nfe) { 11583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 11593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (IOException ioe) { 11603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 11613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return 0; 11633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11653f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 11663f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @deprecated use getRadioDataUptime 11673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 11683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getRadioDataUptimeMs() { 11693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getRadioDataUptime() / 1000; 11703f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11713f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 11723f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 11735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh * Returns the duration that the cell radio was up for data transfers. 11743f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 11753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public long getRadioDataUptime() { 11763718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (mRadioDataStart == -1) { 11773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return mRadioDataUptime; 11783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 11793f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentRadioDataUptime() - mRadioDataStart; 11803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int getCurrentBluetoothPingCount() { 11843f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBtHeadset != null) { 11855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh List<BluetoothDevice> deviceList = mBtHeadset.getConnectedDevices(); 11865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh if (deviceList.size() > 0) { 11875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh return mBtHeadset.getBatteryUsageHint(deviceList.get(0)); 11883f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 11893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return -1; 11913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11923f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 11933f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public int getBluetoothPingCount() { 11943f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBluetoothPingStart == -1) { 11953f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return mBluetoothPingCount; 11963f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } else if (mBtHeadset != null) { 11973f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentBluetoothPingCount() - mBluetoothPingStart; 11983f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 119982cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani return 0; 12003f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 12013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 12023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public void setBtHeadset(BluetoothHeadset headset) { 120382cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) { 120482cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 120582cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani } 12063f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBtHeadset = headset; 12073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 12083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 12090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int mChangedBufferStates = 0; 12100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void addHistoryBufferLocked(long curTime) { 12120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mHaveBatteryLevel || !mRecordingHistory) { 12130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12161fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final long timeDiff = (mHistoryBaseTime+curTime) - mHistoryLastWritten.time; 12170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mHistoryBufferLastPos >= 0 && mHistoryLastWritten.cmd == HistoryItem.CMD_UPDATE 12181fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn && timeDiff < 2000 12190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn && ((mHistoryLastWritten.states^mHistoryCur.states)&mChangedBufferStates) == 0) { 12200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // If the current is the same as the one before, then we no 12210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // longer need the entry. 12220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataSize(mHistoryBufferLastPos); 12230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBufferLastPos); 12240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBufferLastPos = -1; 12250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mHistoryLastLastWritten.cmd == HistoryItem.CMD_UPDATE 12261fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn && timeDiff < 500 && mHistoryLastLastWritten.same(mHistoryCur)) { 12270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // If this results in us returning to the state written 12280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // prior to the last one, then we can just delete the last 12290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // written one and drop the new one. Nothing more to do. 12300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.setTo(mHistoryLastLastWritten); 12310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL; 12320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mChangedBufferStates |= mHistoryLastWritten.states^mHistoryCur.states; 12350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn curTime = mHistoryLastWritten.time - mHistoryBaseTime; 12361fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mHistoryLastWritten.setTo(mHistoryLastLastWritten); 12370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else { 12380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mChangedBufferStates = 0; 12390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final int dataSize = mHistoryBuffer.dataSize(); 12420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (dataSize >= MAX_HISTORY_BUFFER) { 12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mHistoryOverflow) { 12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryOverflow = true; 12450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(curTime, HistoryItem.CMD_OVERFLOW); 12460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Once we've reached the maximum number of items, we only 12490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // record changes to the battery level and the most interesting states. 12500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Once we've reached the maximum maximum number of items, we only 12510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // record changes to the battery level. 12520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mHistoryLastWritten.batteryLevel == mHistoryCur.batteryLevel && 12530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn (dataSize >= MAX_MAX_HISTORY_BUFFER 12540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn || ((mHistoryEnd.states^mHistoryCur.states) 12550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn & HistoryItem.MOST_INTERESTING_STATES) == 0)) { 12560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(curTime, HistoryItem.CMD_UPDATE); 12610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void addHistoryBufferLocked(long curTime, byte cmd) { 12640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int origPos = 0; 12650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mIteratingHistory) { 12660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn origPos = mHistoryBuffer.dataPosition(); 12670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); 12680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBufferLastPos = mHistoryBuffer.dataPosition(); 12700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastLastWritten.setTo(mHistoryLastWritten); 12710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur); 12720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.writeDelta(mHistoryBuffer, mHistoryLastLastWritten); 12730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mLastHistoryTime = curTime; 12740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "Writing history buffer: was " + mHistoryBufferLastPos 12750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " now " + mHistoryBuffer.dataPosition() 12760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " size is now " + mHistoryBuffer.dataSize()); 12770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mIteratingHistory) { 12780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(origPos); 12790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1282f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn int mChangedStates = 0; 1283f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 12846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(long curTime) { 12850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(curTime); 12860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mHaveBatteryLevel || !mRecordingHistory) { 12886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 12896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 12909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 12919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // If the current time is basically the same as the last time, 1292f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // and no states have since the last recorded entry changed and 1293f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // are now resetting back to their original value, then just collapse 1294f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // into one record. 12959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE 1296f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+2000) 1297f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn && ((mHistoryEnd.states^mHistoryCur.states)&mChangedStates) == 0) { 12989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // If the current is the same as the one before, then we no 12999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // longer need the entry. 13009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE 13011fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+500) 13029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && mHistoryLastEnd.same(mHistoryCur)) { 13039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd.next = null; 13049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd.next = mHistoryCache; 13059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCache = mHistoryEnd; 13069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd = mHistoryLastEnd; 13079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd = null; 13089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } else { 1309f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn mChangedStates |= mHistoryEnd.states^mHistoryCur.states; 13109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, mHistoryCur); 13119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return; 13139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1315f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn mChangedStates = 0; 1316f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 1317f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn if (mNumHistoryItems == MAX_HISTORY_ITEMS 1318f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) { 13197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn addHistoryRecordLocked(curTime, HistoryItem.CMD_OVERFLOW); 13207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 13217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 13226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mNumHistoryItems >= MAX_HISTORY_ITEMS) { 13236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // Once we've reached the maximum number of items, we only 1324f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // record changes to the battery level and the most interesting states. 1325f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // Once we've reached the maximum maximum number of items, we only 13266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // record changes to the battery level. 13276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryEnd != null && mHistoryEnd.batteryLevel 1328f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn == mHistoryCur.batteryLevel && 1329f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS 1330f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn || ((mHistoryEnd.states^mHistoryCur.states) 1331f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn & HistoryItem.MOST_INTERESTING_STATES) == 0)) { 13326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 13336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 13346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 13359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 13366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE); 13376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 13385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(long curTime, byte cmd) { 13406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem rec = mHistoryCache; 134132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec != null) { 134232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCache = rec.next; 134332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 13446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn rec = new HistoryItem(); 134532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur); 13475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(rec); 134932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(HistoryItem rec) { 13526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mNumHistoryItems++; 135332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec.next = null; 13549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd = mHistoryEnd; 135532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mHistoryEnd != null) { 135632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd.next = rec; 135732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd = rec; 135832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 135932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistory = mHistoryEnd = rec; 136032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 136132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void clearHistoryLocked() { 13640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "********** CLEARING HISTORY!"); 136532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mHistory != null) { 136632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd.next = mHistoryCache; 136732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCache = mHistory; 13689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistory = mHistoryLastEnd = mHistoryEnd = null; 136932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mNumHistoryItems = 0; 13716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryBaseTime = 0; 13720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mLastHistoryTime = 0; 13730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 13740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataSize(0); 13750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 13760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER/2); 13770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL; 13780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.cmd = HistoryItem.CMD_NULL; 13790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBufferLastPos = -1; 13800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryOverflow = false; 138132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void doUnplugLocked(long batteryUptime, long batteryRealtime) { 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 13861719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff u.mStartedTcpBytesReceived = TrafficStats.getUidRxBytes(u.mUid); 13871719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff u.mStartedTcpBytesSent = TrafficStats.getUidTxBytes(u.mUid); 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived; 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent; 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime); 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track total mobile data 13951719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mMobileDataRx, TrafficStats.getMobileRxBytes()); 13961719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mMobileDataTx, TrafficStats.getMobileTxBytes()); 13971719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mTotalDataRx, TrafficStats.getTotalRxBytes()); 13981719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mTotalDataTx, TrafficStats.getTotalTxBytes()); 13993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 14003f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataStart = getCurrentRadioDataUptime(); 14013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = 0; 14023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 14033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 14043f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = 0; 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 14076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void doPlugLocked(long batteryUptime, long batteryRealtime) { 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesReceived >= 0) { 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived(); 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesReceived = -1; 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesSent >= 0) { 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent(); 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesSent = -1; 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).plug(batteryUptime, batteryRealtime); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14221719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mMobileDataRx, TrafficStats.getMobileRxBytes()); 14231719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mMobileDataTx, TrafficStats.getMobileTxBytes()); 14241719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mTotalDataRx, TrafficStats.getTotalRxBytes()); 14251719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mTotalDataTx, TrafficStats.getTotalTxBytes()); 14263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 14273f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataUptime = getRadioDataUptime(); 14283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 14293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 14303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 14313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = getBluetoothPingCount(); 14323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 14359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn int mWakeLockNesting; 14369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 14379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartWakeLocked(int uid, int pid, String name, int type) { 14381ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (type == WAKE_TYPE_PARTIAL) { 14391ebccf531d1049853b3b0630035434619682c016Dianne Hackborn // Only care about partial wake locks, since full wake locks 14401ebccf531d1049853b3b0630035434619682c016Dianne Hackborn // will be canceled when the user puts the screen to sleep. 14411ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWakeLockNesting == 0) { 14421ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG; 14431ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: " 14441ebccf531d1049853b3b0630035434619682c016Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 14451ebccf531d1049853b3b0630035434619682c016Dianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 14461ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 14471ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mWakeLockNesting++; 14489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (uid >= 0) { 14500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { 14510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); 14520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); 14530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type); 14559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 14589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopWakeLocked(int uid, int pid, String name, int type) { 14591ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (type == WAKE_TYPE_PARTIAL) { 14601ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mWakeLockNesting--; 14611ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWakeLockNesting == 0) { 14621ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG; 14631ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: " 14641ebccf531d1049853b3b0630035434619682c016Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 14651ebccf531d1049853b3b0630035434619682c016Dianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 14661ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 14679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (uid >= 0) { 14690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { 14700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); 14710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); 14720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type); 14749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 14777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) { 14787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 14797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 14807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteStartWakeLocked(ws.get(i), pid, name, type); 14817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 14827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 14837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 14847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) { 14857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 14867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 14877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteStopWakeLocked(ws.get(i), pid, name, type); 14887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 14897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 14907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 14910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public int startAddingCpuLocked() { 14920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.removeMessages(MSG_UPDATE_WAKELOCKS); 14930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 14940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (mScreenOn) { 14950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 14960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 14980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int N = mPartialTimers.size(); 14990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (N == 0) { 15000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.clear(); 15010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 15020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // How many timers should consume CPU? Only want to include ones 15050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // that have already been in the list. 15060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 15070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 15080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 15090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 15100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // We don't include the system UID, because it so often 15110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // holds wake locks at one request or another of an app. 15120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 15130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 50; 15140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 15190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void finishAddingCpuLocked(int perc, int utime, int stime, long[] cpuSpeedTimes) { 15220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int N = mPartialTimers.size(); 15230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (perc != 0) { 15240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn int num = 0; 15250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 15260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 15270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 15280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 15290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // We don't include the system UID, because it so often 15300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // holds wake locks at one request or another of an app. 15310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 15320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn num++; 15330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (num != 0) { 15370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 15380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 15390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 15400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 15410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 1542618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn int myUTime = utime/num; 1543618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn int mySTime = stime/num; 1544618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn utime -= myUTime; 1545618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn stime -= mySTime; 1546618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn num--; 15470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*"); 15480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addCpuTimeLocked(myUTime, mySTime); 15490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addSpeedStepTimes(cpuSpeedTimes); 15500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // Just in case, collect any lost CPU time. 15560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (utime != 0 || stime != 0) { 15570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = getUidStatsLocked(Process.SYSTEM_UID); 15580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null) { 15590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid.Proc proc = uid.getProcessStatsLocked("*lost*"); 15600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addCpuTimeLocked(utime, stime); 15610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addSpeedStepTimes(cpuSpeedTimes); 15620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int NL = mLastPartialTimers.size(); 15670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn boolean diff = N != NL; 15680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL && !diff; i++) { 15690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i); 15700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!diff) { 15720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL; i++) { 15730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPartialTimers.get(i).mInList = true; 15740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return; 15760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL; i++) { 15790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.get(i).mInList = false; 15800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.clear(); 15820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 15830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 15840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn st.mInList = true; 15850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.add(st); 15860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteProcessDiedLocked(int uid, int pid) { 15909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 15919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 15929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn u.mPids.remove(pid); 15939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 15969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public long getProcessWakeTime(int uid, int pid, long realtime) { 15979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 15989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 15999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid.Pid p = u.mPids.get(pid); 16009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p != null) { 16019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return p.mWakeSum + (p.mWakeStart != 0 ? (realtime - p.mWakeStart) : 0); 16029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return 0; 16059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) { 16089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 16099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 16109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn u.reportExcessiveWakeLocked(proc, overTime, usedTime); 16119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1614287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) { 1615287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Uid u = mUidStats.get(uid); 1616287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (u != null) { 1617287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn u.reportExcessiveCpuLocked(proc, overTime, usedTime); 1618287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1619287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1620287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 16219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn int mSensorNesting; 16229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartSensorLocked(int uid, int sensor) { 16249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mSensorNesting == 0) { 16259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG; 16269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: " 16279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mSensorNesting++; 16319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStartSensor(sensor); 16329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopSensorLocked(int uid, int sensor) { 16359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mSensorNesting--; 16369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mSensorNesting == 0) { 16379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG; 16389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: " 16399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStopSensor(sensor); 16439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 164532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mGpsNesting; 16465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 16476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteStartGpsLocked(int uid) { 164832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 16496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG; 165032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: " 165132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 165332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 165432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting++; 16552e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStartGps(); 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16575a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 16586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteStopGpsLocked(int uid) { 165932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting--; 166032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 16616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG; 166232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: " 166332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 166532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 16662e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStopGps(); 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOnLocked() { 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mScreenOn) { 16716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG; 167232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " 167332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = true; 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.startRunningLocked(this); 1677617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1678617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this); 1679617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 16809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // Fake a wake lock, so we consider the device waked as long 16829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // as the screen is on. 16831ebccf531d1049853b3b0630035434619682c016Dianne Hackborn noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); 1684c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 1685c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn // Update discharge amounts. 1686c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBatteryInternal) { 168732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateDischargeScreenLevelsLocked(false, true); 1688c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOffLocked() { 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mScreenOn) { 16946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG; 169532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: " 169632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.stopRunningLocked(this); 1700617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1701617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1702617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 17039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 17041ebccf531d1049853b3b0630035434619682c016Dianne Hackborn noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); 1705c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 1706c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn // Update discharge amounts. 1707c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBatteryInternal) { 170832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateDischargeScreenLevelsLocked(true, false); 1709c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 1710617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1711617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 17125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1713617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightnessLocked(int brightness) { 1714617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Bin the brightness. 1715617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS); 1716617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (bin < 0) bin = 0; 1717617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1; 1718617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin != bin) { 17196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK) 17206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT); 172132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: " 172232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 17236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1724617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenOn) { 1725617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1726617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1727617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1728617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[bin].startRunningLocked(this); 1729617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1730617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessBin = bin; 1731617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1732617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 17335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 17344cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void noteInputEventAtomic() { 17354cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mInputEventCounter.stepAtomic(); 1736617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 17375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1738617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int uid, int event) { 17392e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteUserActivityLocked(event); 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOnLocked() { 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPhoneOn) { 17443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG; 174532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: " 174632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 17476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = true; 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.startRunningLocked(this); 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOffLocked() { 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPhoneOn) { 17553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG; 175632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: " 175732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 17586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.stopRunningLocked(this); 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 176332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 17643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn void stopAllSignalStrengthTimersLocked(int except) { 17655284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 17663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (i == except) { 17673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn continue; 17683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 17693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) { 17703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mPhoneSignalStrengthsTimer[i].stopRunningLocked(this); 17713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 17723bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 17733bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 17743bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 1775e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private int fixPhoneServiceState(int state, int signalBin) { 1776e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mPhoneSimStateRaw == TelephonyManager.SIM_STATE_ABSENT) { 1777e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // In this case we will always be STATE_OUT_OF_SERVICE, so need 1778e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // to infer that we are scanning from other data. 1779e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (state == ServiceState.STATE_OUT_OF_SERVICE 17805284090631e638b916d9a453212e9dc802656a67Wink Saville && signalBin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 1781e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn state = ServiceState.STATE_IN_SERVICE; 1782e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1783e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1784e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1785e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return state; 1786e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1787e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1788e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private void updateAllPhoneStateLocked(int state, int simState, int bin) { 17893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn boolean scanning = false; 1790e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean newHistory = false; 17913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 1792e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneServiceStateRaw = state; 1793e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSimStateRaw = simState; 1794e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthBinRaw = bin; 1795e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1796e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (simState == TelephonyManager.SIM_STATE_ABSENT) { 1797e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // In this case we will always be STATE_OUT_OF_SERVICE, so need 1798e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // to infer that we are scanning from other data. 1799e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (state == ServiceState.STATE_OUT_OF_SERVICE 18005284090631e638b916d9a453212e9dc802656a67Wink Saville && bin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 1801e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn state = ServiceState.STATE_IN_SERVICE; 1802e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1803e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 18043bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 18053bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If the phone is powered off, stop all timers. 18063bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (state == ServiceState.STATE_POWER_OFF) { 1807e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn bin = -1; 1808f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 1809e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // If we are in service, make sure the correct signal string timer is running. 1810e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (state == ServiceState.STATE_IN_SERVICE) { 1811e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // Bin will be changed below. 18123bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 18133bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If we're out of service, we are in the lowest signal strength 18143bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // bin and have the scanning bit set. 1815f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } else if (state == ServiceState.STATE_OUT_OF_SERVICE) { 18163bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn scanning = true; 18175284090631e638b916d9a453212e9dc802656a67Wink Saville bin = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1818f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (!mPhoneSignalScanningTimer.isRunningLocked()) { 18196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG; 1820e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 18216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: " 18226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 1823f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.startRunningLocked(this); 1824f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1825f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 18265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 18273bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (!scanning) { 18283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If we are no longer scanning, then stop the scanning timer. 18293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (mPhoneSignalScanningTimer.isRunningLocked()) { 18303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG; 18313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: " 18323bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 1833e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 18343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mPhoneSignalScanningTimer.stopRunningLocked(this); 18353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 18363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 18373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 183832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mPhoneServiceState != state) { 18396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK) 18406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (state << HistoryItem.STATE_PHONE_STATE_SHIFT); 1841e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + state + " to: " 184232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 1843e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 184432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mPhoneServiceState = state; 184532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 1846e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1847e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mPhoneSignalStrengthBin != bin) { 1848e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mPhoneSignalStrengthBin >= 0) { 1849e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this); 1850e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1851e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (bin >= 0) { 1852e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) { 1853e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 1854e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1855e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_SIGNAL_STRENGTH_MASK) 1856e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn | (bin << HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT); 1857e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: " 1858e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 1859e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 1860e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 1861e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn stopAllSignalStrengthTimersLocked(-1); 1862e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1863e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthBin = bin; 1864e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1865e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1866e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (newHistory) { 1867e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1868e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1869e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1870e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1871e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn /** 1872e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * Telephony stack updates the phone state. 1873e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * @param state phone state from ServiceState.getState() 1874e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn */ 1875e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn public void notePhoneStateLocked(int state, int simState) { 1876e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn updateAllPhoneStateLocked(state, simState, mPhoneSignalStrengthBinRaw); 187732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 187832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 1879e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) { 1880627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Bin the strength. 18815284090631e638b916d9a453212e9dc802656a67Wink Saville int bin = signalStrength.getLevel(); 1882e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn updateAllPhoneStateLocked(mPhoneServiceStateRaw, mPhoneSimStateRaw, bin); 1883627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 18845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1885627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) { 1886627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin = DATA_CONNECTION_NONE; 1887627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (hasData) { 1888627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn switch (dataType) { 1889627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_EDGE: 1890627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_EDGE; 1891627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1892627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_GPRS: 1893627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_GPRS; 1894627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1895627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_UMTS: 1896627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_UMTS; 1897627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 18986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_CDMA: 18996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_CDMA; 19006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_0: 19026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_0; 19036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_A: 19056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_A; 19066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_1xRTT: 19086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_1xRTT; 19096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSDPA: 19116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSDPA; 19126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSUPA: 19146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSUPA; 19156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSPA: 19176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSPA; 19186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_IDEN: 19206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_IDEN; 19216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_B: 19236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_B; 19246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 1925962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt case TelephonyManager.NETWORK_TYPE_LTE: 1926962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt bin = DATA_CONNECTION_LTE; 1927962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt break; 1928962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt case TelephonyManager.NETWORK_TYPE_EHRPD: 1929962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt bin = DATA_CONNECTION_EHRPD; 1930962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt break; 1931627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn default: 1932627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_OTHER; 1933627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1934627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1935627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 19363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData); 1937627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType != bin) { 19386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK) 19396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT); 194032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: " 194132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1943627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType >= 0) { 1944627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this); 1945627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1946627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionType = bin; 1947627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[bin].startRunningLocked(this); 1948627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1949627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 19505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 195158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOnLocked() { 1952105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mWifiOn) { 19536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG; 195432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: " 195532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1957105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = true; 1958105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.startRunningLocked(this); 1959105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1960105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 19615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 196258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOffLocked() { 1963105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mWifiOn) { 19646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG; 196532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: " 196632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1968105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 1969105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.stopRunningLocked(this); 1970105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1971617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 197258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked(); 1973617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = -1; 1974617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1975105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1976244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1977244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOnLocked(int uid) { 1978244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioOn) { 19796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG; 198032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: " 198132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1983244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = true; 1984244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.startRunningLocked(this); 1985244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 19862e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOnLocked(); 1987244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 19885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1989244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOffLocked(int uid) { 1990244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioOn) { 19916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; 199232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " 199332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1995244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = false; 1996244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.stopRunningLocked(this); 1997244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 19982e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOffLocked(); 1999244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2000244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2001244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOnLocked(int uid) { 2002244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoOn) { 20036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG; 200432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: " 200532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2007244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = true; 2008244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.startRunningLocked(this); 2009244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 20102e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOnLocked(); 2011244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 20125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2013244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOffLocked(int uid) { 2014244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoOn) { 20156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG; 201632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " 201732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2019244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = false; 2020244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.stopRunningLocked(this); 2021244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 20222e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOffLocked(); 2023244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2024244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 202558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningLocked(WorkSource ws) { 202658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (!mGlobalWifiRunning) { 20276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG; 202832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: " 202932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 203158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = true; 203258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.startRunningLocked(this); 203358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = ws.size(); 203458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 203558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(ws.get(i)).noteWifiRunningLocked(); 203658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 203758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 203858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running"); 2039d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2040d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2041d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 204258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) { 204358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mGlobalWifiRunning) { 204458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = oldWs.size(); 204558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 204658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked(); 204758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 204858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn N = newWs.size(); 204958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 205058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked(); 205158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 205258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 205358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running"); 205458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 205558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 205658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 205758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStoppedLocked(WorkSource ws) { 205858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mGlobalWifiRunning) { 20596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RUNNING_FLAG; 206032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: " 206132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 206358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 206458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.stopRunningLocked(this); 206558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = ws.size(); 206658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 206758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked(); 206858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 206958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 207058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running"); 2071d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2072d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2073d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 2074105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOnLocked() { 2075105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mBluetoothOn) { 20766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG; 207732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: " 207832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2080105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = true; 2081105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.startRunningLocked(this); 2082105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2083105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 20845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2085105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOffLocked() { 2086105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mBluetoothOn) { 20876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG; 208832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: " 208932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2091105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 2092105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.stopRunningLocked(this); 2093105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2094105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 20955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 209632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiFullLockNesting = 0; 20975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2098105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked(int uid) { 209932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 21006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; 210132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: " 210232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 210432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 210532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting++; 21062e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked(); 2107105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2109105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked(int uid) { 211032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting--; 211132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 21126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; 211332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: " 211432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 211632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 21172e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockReleasedLocked(); 2118105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2119105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 212032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiScanLockNesting = 0; 21215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2122105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked(int uid) { 212332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiScanLockNesting == 0) { 21246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG; 212532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: " 212632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 212832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 212932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiScanLockNesting++; 21302e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked(); 2131105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2132105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2133105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked(int uid) { 213432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiScanLockNesting--; 213532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiScanLockNesting == 0) { 21366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG; 213732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: " 213832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 214032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 21412e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockReleasedLocked(); 2142105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 21435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 214432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiMulticastNesting = 0; 21455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 21465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked(int uid) { 214732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 21486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; 214932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: " 215032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 215232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 215332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting++; 21542e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastEnabledLocked(); 21555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 21565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 21575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked(int uid) { 215832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting--; 215932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 21606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; 216132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: " 216232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 216432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 21652e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastDisabledLocked(); 21665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 21675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 21687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) { 21697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 21717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteFullWifiLockAcquiredLocked(ws.get(i)); 21727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 21757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) { 21767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 21787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteFullWifiLockReleasedLocked(ws.get(i)); 21797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 21827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteScanWifiLockAcquiredFromSourceLocked(WorkSource ws) { 21837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 21857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteScanWifiLockAcquiredLocked(ws.get(i)); 21867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 21897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteScanWifiLockReleasedFromSourceLocked(WorkSource ws) { 21907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 21927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteScanWifiLockReleasedLocked(ws.get(i)); 21937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 21967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) { 21977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 21997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteWifiMulticastEnabledLocked(ws.get(i)); 22007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 22037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) { 22047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 22057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 22067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteWifiMulticastDisabledLocked(ws.get(i)); 22077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getScreenOnTime(long batteryRealtime, int which) { 2211c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which); 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2214617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public long getScreenBrightnessTime(int brightnessBin, 2215617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long batteryRealtime, int which) { 2216c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked( 2217617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn batteryRealtime, which); 2218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2219244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getInputEventCount(int which) { 2221c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mInputEventCounter.getCountLocked(which); 2222617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 22235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getPhoneOnTime(long batteryRealtime, int which) { 2225c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which); 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2227244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2228627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneSignalStrengthTime(int strengthBin, 2229627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 2230c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked( 2231627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 2232627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2233f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 2234f37447bad3773b62176baa837908daf6edb44273Amith Yamasani @Override public long getPhoneSignalScanningTime( 2235f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long batteryRealtime, int which) { 2236f37447bad3773b62176baa837908daf6edb44273Amith Yamasani return mPhoneSignalScanningTimer.getTotalTimeLocked( 2237f37447bad3773b62176baa837908daf6edb44273Amith Yamasani batteryRealtime, which); 2238f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 2239f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 2240617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneSignalStrengthCount(int dataType, int which) { 2241c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 2242617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 22435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2244627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneDataConnectionTime(int dataType, 2245627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 2246c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked( 2247627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 2248627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 22495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2250617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneDataConnectionCount(int dataType, int which) { 2251c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 2252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 22535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2254105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getWifiOnTime(long batteryRealtime, int which) { 2255c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which); 2256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 22575a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 225858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) { 225958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 2260d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2261d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 2262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getBluetoothOnTime(long batteryRealtime, int which) { 2263c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which); 2264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 22655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean getIsOnBattery() { 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() { 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUidStats; 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular uid. 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Uid extends BatteryStats.Uid { 22785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mUid; 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesReceived; 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesSent; 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesReceived; 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesSent; 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesReceivedAtLastUnplug; 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesSentAtLastUnplug; 22865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are not saved/restored when parcelling, since we want 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to return from the parcel with a snapshot of the state. 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesReceived = -1; 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesSent = -1; 22915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 229258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn boolean mWifiRunning; 229358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn StopwatchTimer mWifiRunningTimer; 22945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2295105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mFullWifiLockOut; 2296c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mFullWifiLockTimer; 22975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2298105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mScanWifiLockOut; 2299c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScanWifiLockTimer; 23005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt boolean mWifiMulticastEnabled; 23025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt StopwatchTimer mWifiMulticastTimer; 23035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2304244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioTurnedOn; 2305244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioTurnedOnTimer; 23065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2307244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoTurnedOn; 2308244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoTurnedOnTimer; 23095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2310617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter[] mUserActivityCounters; 23115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's wake locks. 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>(); 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's sensor activations. 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>(); 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>(); 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>(); 23315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn /** 23339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn * The transient wake stats we have collected for this uid's pids. 23349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn */ 23359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn final SparseArray<Pid> mPids = new SparseArray<Pid>(); 23369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid(int uid) { 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUid = uid; 233958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 234058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables); 23410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 234258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables); 23430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK, 234458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers, mUnpluggables); 23450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 234658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables); 23470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 23480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables); 23490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 23505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt null, mUnpluggables); 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() { 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWakelockStats; 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() { 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSensorStats; 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() { 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProcessStats; 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() { 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageStats; 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2372eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2373eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getUid() { 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUid; 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2377eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2378eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesReceived(int which) { 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesReceived; 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesReceived(); 23846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesReceivedAtLastUnplug; 23866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesReceived; 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesReceived() { 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0 23951719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff ? (TrafficStats.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0); 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2397eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2398eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesSent(int which) { 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesSent; 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesSent(); 24046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesSentAtLastUnplug; 24066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesSent; 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2413105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 241458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningLocked() { 241558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (!mWifiRunning) { 241658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = true; 241758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer == null) { 241858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 241958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables); 24206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 242158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this); 2422617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 24245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2425617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 242658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStoppedLocked() { 242758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunning) { 242858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = false; 242958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this); 2430617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 24325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2434105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked() { 2435105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mFullWifiLockOut) { 2436105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = true; 24376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer == null) { 24380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 243958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables); 24406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2441105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 2442105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2445105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2446105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked() { 2447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mFullWifiLockOut) { 2448105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 2449105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 2450105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2451105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2453105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2454105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked() { 2455105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mScanWifiLockOut) { 2456105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = true; 24576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer == null) { 24580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK, 245958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers, mUnpluggables); 24606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2461105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 2462105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2463105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2465105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2466105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked() { 2467105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mScanWifiLockOut) { 2468105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 2469105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 2470105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2471105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 24745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked() { 24755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (!mWifiMulticastEnabled) { 24765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = true; 24776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer == null) { 24780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 247958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables); 24806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this); 24825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 24865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked() { 24875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (mWifiMulticastEnabled) { 24885347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 24895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this); 24905347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24915347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24925347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 24946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteAudioTurnedOnLocked() { 24956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mAudioTurnedOn) { 24966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = true; 24976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer == null) { 24980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 24996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables); 25006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 25026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2503617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2504244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 25056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 25066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteAudioTurnedOffLocked() { 25076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOn) { 25086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = false; 25096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 25106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 25146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteVideoTurnedOnLocked() { 25156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mVideoTurnedOn) { 25166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = true; 25176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer == null) { 25180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 25196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables); 25206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 25226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 25266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteVideoTurnedOffLocked() { 25276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOn) { 25286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = false; 25296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 25306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2531244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2532244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 25335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 253458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public long getWifiRunningTime(long batteryRealtime, int which) { 253558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer == null) { 25366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 253858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 2539244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2540244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 25415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 2542105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getFullWifiLockTime(long batteryRealtime, int which) { 25436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer == null) { 25446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 2547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 25485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 25495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 2550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getScanWifiLockTime(long batteryRealtime, int which) { 25516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer == null) { 25526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 2555105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 25565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 25575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 25585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public long getWifiMulticastTime(long batteryRealtime, int which) { 25596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer == null) { 25606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime, 25635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt which); 25645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 25655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 25665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 25676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public long getAudioTurnedOnTime(long batteryRealtime, int which) { 25686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer == null) { 25696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 25726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 25756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public long getVideoTurnedOnTime(long batteryRealtime, int which) { 25766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer == null) { 25776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 25806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 2582617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2583617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int type) { 2584617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 2585617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn initUserActivityLocked(); 2586617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2587617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (type < 0) type = 0; 2588617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1; 25894cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUserActivityCounters[type].stepAtomic(); 2590617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 25915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2592617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2593617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public boolean hasUserActivity() { 2594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return mUserActivityCounters != null; 2595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 25965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2597617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2598617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public int getUserActivityCount(int type, int which) { 2599617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 2600617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return 0; 2601617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUserActivityCounters[type].getCountLocked(which); 2603617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 26045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2605617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void initUserActivityLocked() { 2606617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 2607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2608617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables); 2609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2610617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 26115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesSent() { 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0 26141719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff ? (TrafficStats.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0); 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2616244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 26176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 26186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear all stats for this uid. Returns true if the uid is completely 26196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * inactive so can be dropped. 26206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 26216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 26226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean active = false; 26235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 262458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 262558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false); 262658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn active |= mWifiRunning; 26276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 26299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false); 26306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mFullWifiLockOut; 26316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer != null) { 26339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mScanWifiLockTimer.reset(BatteryStatsImpl.this, false); 26346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mScanWifiLockOut; 26356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 26379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false); 26386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mWifiMulticastEnabled; 26396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 26419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false); 26426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mAudioTurnedOn; 26436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 26459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false); 26466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mVideoTurnedOn; 26476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 26496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0; 26506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0; 26515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 26526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 26536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 26546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters[i].reset(false); 26556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 26586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWakelockStats.size() > 0) { 26596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator(); 26606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 26616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Wakelock> wakelockEntry = it.next(); 26626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Wakelock wl = wakelockEntry.getValue(); 26636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (wl.reset()) { 26646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn it.remove(); 26656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 26666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active = true; 26676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mSensorStats.size() > 0) { 26716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator(); 26726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 26736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<Integer, Sensor> sensorEntry = it.next(); 26746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Sensor s = sensorEntry.getValue(); 26756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (s.reset()) { 26766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn it.remove(); 26776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 26786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active = true; 26796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mProcessStats.size() > 0) { 26836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator(); 26846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 26856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Proc> procEntry = it.next(); 26866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn procEntry.getValue().detach(); 26876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mProcessStats.clear(); 26896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mPids.size() > 0) { 26919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; !active && i<mPids.size(); i++) { 26929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid pid = mPids.valueAt(i); 26939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (pid.mWakeStart != 0) { 26949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active = true; 26959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 26969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 26979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 26986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mPackageStats.size() > 0) { 26996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator(); 27006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 27016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Pkg> pkgEntry = it.next(); 27026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Pkg p = pkgEntry.getValue(); 27036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn p.detach(); 27046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (p.mServiceStats.size() > 0) { 27056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Pkg.Serv>> it2 27066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn = p.mServiceStats.entrySet().iterator(); 27076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it2.hasNext()) { 27086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Pkg.Serv> servEntry = it2.next(); 27096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn servEntry.getValue().detach(); 27106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mPackageStats.clear(); 27146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 27169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPids.clear(); 27179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 27186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!active) { 271958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 272058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.detach(); 27216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 27236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer.detach(); 27246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer != null) { 27266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mScanWifiLockTimer.detach(); 27276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 27296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer.detach(); 27306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 27326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.detach(); 27336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 27356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.detach(); 27366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 27396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters[i].detach(); 27406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 27446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return !active; 27456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakelockStats.size()); 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) { 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(wakelockEntry.getKey()); 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = wakelockEntry.getValue(); 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.writeToParcelLocked(out, batteryRealtime); 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mSensorStats.size()); 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) { 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(sensorEntry.getKey()); 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = sensorEntry.getValue(); 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.writeToParcelLocked(out, batteryRealtime); 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mProcessStats.size()); 27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) { 27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(procEntry.getKey()); 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = procEntry.getValue(); 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.writeToParcelLocked(out); 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mPackageStats.size()); 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) { 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(pkgEntry.getKey()); 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = pkgEntry.getValue(); 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.writeToParcelLocked(out); 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesReceived); 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesSent); 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesReceived()); 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesSent()); 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesReceivedAtLastUnplug); 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesSentAtLastUnplug); 278258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 27836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 278458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.writeToParcel(out, batteryRealtime); 27856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 2786617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 27876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 27896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 27906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer.writeToParcel(out, batteryRealtime); 2791617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 27926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 27936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer != null) { 27956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 27966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mScanWifiLockTimer.writeToParcel(out, batteryRealtime); 27976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 27986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 27996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 28016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 28026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer.writeToParcel(out, batteryRealtime); 28036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 28056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 28076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 28086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime); 28096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 28116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 28136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 28146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime); 28156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 28176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 2819617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 2820617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2821617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i].writeToParcel(out); 2822617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 28236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 2825617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numWakelocks = in.readInt(); 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.clear(); 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < numWakelocks; j++) { 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wakelockName = in.readString(); 28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = new Wakelock(); 28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.readFromParcelLocked(unpluggables, in); 28359e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) { 28369e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // We will just drop some random set of wakelocks if 28379e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // the previous run of the system was an older version 28389e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // that didn't impose a limit. 28399e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn mWakelockStats.put(wakelockName, wakelock); 28409e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numSensors = in.readInt(); 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.clear(); 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numSensors; k++) { 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = in.readInt(); 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = new Sensor(sensorNumber); 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.readFromParcelLocked(mUnpluggables, in); 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensorNumber, sensor); 28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numProcs = in.readInt(); 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.clear(); 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numProcs; k++) { 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String processName = in.readString(); 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = new Proc(); 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.readFromParcelLocked(in); 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(processName, proc); 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numPkgs = in.readInt(); 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.clear(); 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int l = 0; l < numPkgs; l++) { 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = in.readString(); 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = new Pkg(); 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.readFromParcelLocked(in); 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(packageName, pkg); 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesReceived = in.readLong(); 28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesSent = in.readLong(); 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesReceived = in.readLong(); 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesSent = in.readLong(); 28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesReceivedAtLastUnplug = in.readLong(); 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesSentAtLastUnplug = in.readLong(); 287658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = false; 28776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 287858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 287958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables, in); 28806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 288158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = null; 28826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2883105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 28846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 28850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 288658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables, in); 28876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer = null; 28896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2890105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 28916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 28920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK, 289358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers, mUnpluggables, in); 28946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mScanWifiLockTimer = null; 28966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 28986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 28990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 290058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables, in); 2901617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 29026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer = null; 29036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = false; 29056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 29060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 29076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables, in); 29086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 29096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer = null; 29106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = false; 29126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 29130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 29146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables, in); 29156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 29166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer = null; 29176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 2919617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 2920617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2921617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables, in); 2922617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 29236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 29246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters = null; 2925617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular wake lock. 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Wakelock extends BatteryStats.Uid.Wakelock { 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device partially awake. 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2935c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerPartial; 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device fully awake. 29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2940c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerFull; 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has had a window keeping the device awake. 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2945c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerWindow; 29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a possibly null Timer from a Parcel. The timer is associated with the 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proper timer pool from the given BatteryStatsImpl object. 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in the Parcel to be read from. 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return a new Timer, or null. 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2954c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool, 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<Unpluggable> unpluggables, Parcel in) { 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return new StopwatchTimer(Uid.this, type, pool, unpluggables, in); 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 29646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean wlactive = false; 29656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerFull != null) { 29669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false); 29676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPartial != null) { 29699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false); 29706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerWindow != null) { 29729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false); 29736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!wlactive) { 29756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerFull != null) { 29766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerFull.detach(); 29776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerFull = null; 29786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPartial != null) { 29806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPartial.detach(); 29816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPartial = null; 29826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerWindow != null) { 29846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerWindow.detach(); 29856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerWindow = null; 29866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return !wlactive; 29896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, 29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers, unpluggables, in); 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers, unpluggables, in); 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers, unpluggables, in); 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime); 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime); 30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime); 30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getWakeTime(int type) { 30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: return mTimerFull; 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: return mTimerPartial; 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: return mTimerWindow; 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: throw new IllegalArgumentException("type = " + type); 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Sensor extends BatteryStats.Uid.Sensor { 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mHandle; 3019c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimer; 30205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Sensor(int handle) { 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandle = handle; 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3025c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables, 30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in) { 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle); 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool == null) { 3033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pool = new ArrayList<StopwatchTimer>(); 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(mHandle, pool); 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in); 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 30409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mTimer.reset(BatteryStatsImpl.this, true)) { 30416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimer = null; 30426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 30436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return false; 30456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimer = readTimerFromParcel(unpluggables, in); 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimer, batteryRealtime); 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getSensorTime() { 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTimer; 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3060eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHandle() { 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHandle; 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable { 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in user code. 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUserTime; 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in kernel code. 30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSystemTime; 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times the process has been started. 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3086eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Amount of time the process was running in the foreground. 3087eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3088eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mForegroundTime; 3089eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3090eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from a previous save. 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedUserTime; 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from a previous save. 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedSystemTime; 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from a previous save. 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3106eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from a previous save. 3107eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3108eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLoadedForegroundTime; 3109eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3110eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from the previous run. 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUserTime; 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from the previous run. 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastSystemTime; 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from the previous run. 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3126eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from the previous run 3127eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3128eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLastForegroundTime; 3129eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3130eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time when last unplugged. 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedUserTime; 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time when last unplugged. 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedSystemTime; 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started before unplugged. 31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3145eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 3146eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time since unplugged. 3147eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3148eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mUnpluggedForegroundTime; 3149eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3150e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter[] mSpeedBins; 3151e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3152287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ArrayList<ExcessivePower> mExcessivePower; 31539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc() { 31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 3156e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mSpeedBins = new SamplingCounter[getCpuSpeedSteps()]; 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3158e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = mUserTime; 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = mSystemTime; 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 3163eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = mForegroundTime; 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 31696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 31706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 31716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i = 0; i < mSpeedBins.length; i++) { 31726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 31736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c != null) { 31746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(c); 31756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = null; 31766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3180287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int countExcessivePowers() { 3181287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mExcessivePower != null ? mExcessivePower.size() : 0; 31829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 31839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3184287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public ExcessivePower getExcessivePower(int i) { 3185287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower != null) { 3186287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mExcessivePower.get(i); 31879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 31889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return null; 31899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 31909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 31919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void addExcessiveWake(long overTime, long usedTime) { 3192287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 3193287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 31949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 3195287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3196287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = ExcessivePower.TYPE_WAKE; 31979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.overTime = overTime; 31989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.usedTime = usedTime; 3199287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 32009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3202287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void addExcessiveCpu(long overTime, long usedTime) { 3203287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 3204287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 3205287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3206287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3207287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = ExcessivePower.TYPE_CPU; 3208287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.overTime = overTime; 3209287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.usedTime = usedTime; 3210287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 3211287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3212287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 3213287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void writeExcessivePowerToParcelLocked(Parcel out) { 3214287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 32159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeInt(0); 32169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return; 32179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3219287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final int N = mExcessivePower.size(); 32209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeInt(N); 32219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; i<N; i++) { 3222287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = mExcessivePower.get(i); 3223287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn out.writeInt(ew.type); 32249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeLong(ew.overTime); 32259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeLong(ew.usedTime); 32269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 32297b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn boolean readExcessivePowerFromParcelLocked(Parcel in) { 32309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn final int N = in.readInt(); 32319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (N == 0) { 3232287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = null; 32337b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return true; 32349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 32367b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (N > 10000) { 32377b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn Slog.w(TAG, "File corrupt: too many excessive power entries " + N); 32387b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return false; 32397b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 32407b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn 3241287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 32429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; i<N; i++) { 3243287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3244287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = in.readInt(); 32459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.overTime = in.readLong(); 32469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.usedTime = in.readLong(); 3247287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 32489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32497b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return true; 32509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUserTime); 32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mSystemTime); 3255eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mForegroundTime); 32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedUserTime); 32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedSystemTime); 3259eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mLoadedForegroundTime); 32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedUserTime); 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedSystemTime); 3263eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mUnpluggedForegroundTime); 32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 3265e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3266e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(mSpeedBins.length); 3267e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length; i++) { 32686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 32696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c != null) { 32706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 32716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn c.writeToParcel(out); 32726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 32736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 32746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3275e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 32769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3277287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn writeExcessivePowerToParcelLocked(out); 32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime = in.readLong(); 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime = in.readLong(); 3283eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime = in.readLong(); 32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedUserTime = in.readLong(); 32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedSystemTime = in.readLong(); 3287eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mLoadedForegroundTime = in.readLong(); 32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 32893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastUserTime = 0; 32903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastSystemTime = 0; 32913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastForegroundTime = 0; 32923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStarts = 0; 32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = in.readLong(); 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = in.readLong(); 3295eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = in.readLong(); 32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 3297e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3298e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani int bins = in.readInt(); 32996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int steps = getCpuSpeedSteps(); 33006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps]; 3301e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < bins; i++) { 33026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 33036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = new SamplingCounter(mUnpluggables, in); 33046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3305e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 33069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3307287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn readExcessivePowerFromParcelLocked(in); 33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCpuTimeLocked(int utime, int stime) { 33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime += utime; 33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime += stime; 33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public void addForegroundTimeLocked(long ttime) { 3320eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime += ttime; 3321eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3322eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incStartsLocked() { 33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getUserTime(int which) { 33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastUserTime; 33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mUserTime; 33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedUserTime; 33366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedUserTime; 33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSystemTime(int which) { 33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastSystemTime; 33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mSystemTime; 33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedSystemTime; 33526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedSystemTime; 33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3360eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public long getForegroundTime(int which) { 3361eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long val; 3362eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_LAST) { 3363eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mLastForegroundTime; 3364eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } else { 3365eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mForegroundTime; 3366eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_CURRENT) { 3367eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mLoadedForegroundTime; 33686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 3369eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mUnpluggedForegroundTime; 3370eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3371eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3372eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani return val; 3373eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3374eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3375eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 33846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3390e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3391e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /* Called by ActivityManagerService when CPU times are updated. */ 3392e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void addSpeedStepTimes(long[] values) { 3393e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length && i < values.length; i++) { 33946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long amt = values[i]; 33956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (amt != 0) { 33966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 33976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c == null) { 33986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = c = new SamplingCounter(mUnpluggables); 33996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 34006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn c.addCountAtomic(values[i]); 34016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3402e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3403e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3404e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3405e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 3406e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public long getTimeAtCpuSpeedStep(int speedStep, int which) { 3407e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (speedStep < mSpeedBins.length) { 34086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[speedStep]; 34096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return c != null ? c.getCountLocked(which) : 0; 3410e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } else { 3411e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return 0; 3412e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3413e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable { 34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times this package has done something that could wake up the 34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mWakeups; 34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device loaded from a 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous save. 34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedWakeups; 34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastWakeups; 34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedWakeups; 34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statics we have collected for this package's services. 34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>(); 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg() { 34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = mWakeups; 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 34606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 34616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 34626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 34635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups = in.readInt(); 34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedWakeups = in.readInt(); 34673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastWakeups = 0; 34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = in.readInt(); 34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numServs = in.readInt(); 34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.clear(); 34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int m = 0; m < numServs; m++) { 34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String serviceName = in.readString(); 34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = new Serv(); 34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.put(serviceName, serv); 34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.readFromParcelLocked(in); 34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakeups); 34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedWakeups); 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedWakeups); 34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mServiceStats.size()); 34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) { 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(servEntry.getKey()); 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = servEntry.getValue(); 34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.writeToParcelLocked(out); 34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() { 34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServiceStats; 34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWakeups(int which) { 35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastWakeups; 35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mWakeups; 35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedWakeups; 35096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedWakeups; 35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable { 35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left started. 35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartTime; 35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been started and not yet stopped, this is 35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started. 35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRunningSince; 35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently running. 35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning; 35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number of times startService() has been called. 35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left launched. 35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedTime; 35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been launched and not yet exited, this is 35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was launched (ms in battery uptime). 35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedSince; 35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently launched. 35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLaunched; 35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number times the service has been launched. 35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLaunches; 35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started loaded from a previous save 35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (ms in battery uptime). 35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedStartTime; 35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts loaded from a previous save. 35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches loaded from a previous save. 35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedLaunches; 35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started as of the last run (ms 35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastStartTime; 35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts as of the last run. 35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches as of the last run. 35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastLaunches; 35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started when last unplugged (ms 35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedStartTime; 36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts when last unplugged. 36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches when last unplugged. 36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedLaunches; 36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Serv() { 36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime); 36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = mLaunches; 36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 36246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 36256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 36266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 36275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime = in.readLong(); 36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = in.readLong(); 36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = in.readInt() != 0; 36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime = in.readLong(); 36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = in.readLong(); 36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = in.readInt() != 0; 36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches = in.readInt(); 36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStartTime = in.readLong(); 36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedLaunches = in.readInt(); 36403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStartTime = 0; 36413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStarts = 0; 36423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastLaunches = 0; 36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = in.readLong(); 36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = in.readInt(); 36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mStartTime); 36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRunningSince); 36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mRunning ? 1 : 0); 36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedTime); 36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedSince); 36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunched ? 1 : 0); 36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunches); 36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedStartTime); 36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedLaunches); 36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedStartTime); 36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedLaunches); 36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getLaunchTimeToNowLocked(long batteryUptime) { 36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) return mLaunchedTime; 36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLaunchedTime + batteryUptime - mLaunchedSince; 36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getStartTimeToNowLocked(long batteryUptime) { 36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) return mStartTime; 36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartTime + batteryUptime - mRunningSince; 36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLaunchedLocked() { 36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) { 36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches++; 36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = getBatteryUptimeLocked(); 36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = true; 36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopLaunchedLocked() { 36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLaunched) { 36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mLaunchedSince; 36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime += time; 36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches--; 36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = false; 36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startRunningLocked() { 36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) { 36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = getBatteryUptimeLocked(); 36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopRunningLocked() { 37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRunning) { 37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mRunningSince; 37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime += time; 37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts--; 37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = false; 37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLaunches(int which) { 37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastLaunches; 37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLaunches; 37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedLaunches; 37296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedLaunches; 37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getStartTime(long now, int which) { 37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStartTime; 37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = getStartTimeToNowLocked(now); 37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStartTime; 37466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStartTime; 37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 37636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incWakeupsLocked() { 37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups++; 37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Serv newServiceStatsLocked() { 37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Serv(); 37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Proc getProcessStatsLocked(String name) { 37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc ps = mProcessStats.get(name); 37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Proc(); 37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(name, ps); 37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public SparseArray<? extends Pid> getPidStats() { 3800b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn return mPids; 3801b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 38025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 38039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public Pid getPidStatsLocked(int pid) { 38049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = mPids.get(pid); 38059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p == null) { 38069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p = new Pid(); 38079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPids.put(pid, p); 38089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 38099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return p; 38109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 38119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg getPackageStatsLocked(String name) { 38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = mPackageStats.get(name); 38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Pkg(); 38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(name, ps); 38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg.Serv getServiceStatsLocked(String pkg, String serv) { 38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = getPackageStatsLocked(pkg); 38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg.Serv ss = ps.mServiceStats.get(serv); 38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ss == null) { 38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss = ps.newServiceStatsLocked(); 38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps.mServiceStats.put(serv, ss); 38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getWakeTimerLocked(String name, int type) { 38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Wakelock wl = mWakelockStats.get(name); 38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl == null) { 38449e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) { 38459e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn name = BATCHED_WAKELOCK_NAME; 38469e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = mWakelockStats.get(name); 38479e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 38489e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (wl == null) { 38499e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = new Wakelock(); 38509e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn mWakelockStats.put(name, wl); 38519e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = null; 38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: 38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerPartial; 38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 38580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL, 38590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPartialTimers, mUnpluggables); 38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial = t; 38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: 38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerFull; 38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 38660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL, 38670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullTimers, mUnpluggables); 38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull = t; 38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: 38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerWindow; 38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 38740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW, 38750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWindowTimers, mUnpluggables); 38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow = t; 38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("type=" + type); 38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) { 38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sensor se = mSensorStats.get(sensor); 38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se == null) { 38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!create) { 38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se = new Sensor(sensor); 38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensor, se); 38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = se.mTimer; 38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3897c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor); 38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timers == null) { 3899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar timers = new ArrayList<StopwatchTimer>(); 39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(sensor, timers); 39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables); 39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer = t; 39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartWakeLocked(int pid, String name, int type) { 3908c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39121ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { 39139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = getPidStatsLocked(pid); 3914b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn if (p.mWakeStart == 0) { 3915b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn p.mWakeStart = SystemClock.elapsedRealtime(); 3916b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn } 39179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopWakeLocked(int pid, String name, int type) { 3921c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39251ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { 39269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = mPids.get(pid); 3927b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn if (p != null && p.mWakeStart != 0) { 39289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart; 39299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.mWakeStart = 0; 39309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 39349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) { 39359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Proc p = getProcessStatsLocked(proc); 39369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p != null) { 39379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.addExcessiveWake(overTime, usedTime); 39389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3941287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) { 3942287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Proc p = getProcessStatsLocked(proc); 3943287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (p != null) { 3944287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn p.addExcessiveCpu(overTime, usedTime); 3945287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3946287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3947287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int sensor) { 3949c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, true); 39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 39525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh } 39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int sensor) { 39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't create a timer if one doesn't already exist 3957c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, false); 39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 39605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh } 39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps() { 3964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true); 39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 39675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh } 39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps() { 3971c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false); 39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 3974244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(String filename) { 39831afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = new JournaledFile(new File(filename), new File(filename + ".tmp")); 39840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = new MyHandler(); 39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 39860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables); 3987617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 39880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables); 3989617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3990617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables); 39910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables); 39925284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 39930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables); 3994627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 39950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables); 3996627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 39970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables); 3998627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 39990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables); 400058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables); 40010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables); 40020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables); 40030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables); 40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = false; 40056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn initTimes(); 40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = 0; 40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = 0; 40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 4012633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = 0; 40136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = 0; 4014633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = 0; 4015c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn initDischarge(); 40160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn clearHistoryLocked(); 40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(Parcel p) { 40201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 40210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = null; 40220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn clearHistoryLocked(); 40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcel(p); 40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void setCallback(BatteryCallback cb) { 40270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mCallback = cb; 40280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 40290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 4030e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void setNumSpeedSteps(int steps) { 4031e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (sNumSpeedSteps == 0) sNumSpeedSteps = steps; 4032e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 4033e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 4034f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void setRadioScanningTimeout(long timeout) { 4035f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mPhoneSignalScanningTimer != null) { 4036f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.setTimeout(timeout); 4037f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 4038f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 4039f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 40400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 40410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean startIteratingOldHistoryLocked() { 40420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize() 40430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " pos=" + mHistoryBuffer.dataPosition()); 40440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 40451fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mHistoryReadTmp.clear(); 40460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mReadOverflow = false; 40470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = true; 4048ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return (mHistoryIterator = mHistory) != null; 4049ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4050ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 40510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 40520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean getNextOldHistoryLocked(HistoryItem out) { 40530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize(); 40540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!end) { 40551fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mHistoryReadTmp.readDelta(mHistoryBuffer); 40561fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW; 40570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 4058ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn HistoryItem cur = mHistoryIterator; 4059ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (cur == null) { 40600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mReadOverflow && !end) { 40610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "Old history ends before new history!"); 40620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 4063ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return false; 4064ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4065ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn out.setTo(cur); 4066ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mHistoryIterator = cur.next; 40670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mReadOverflow) { 40680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (end) { 40690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "New history ends before old history!"); 40701fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else if (!out.same(mHistoryReadTmp)) { 40710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); 40720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn PrintWriter pw = new PrintWriter(new LogWriter(android.util.Log.WARN, TAG)); 40730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Histories differ!"); 40740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Old history:"); 40750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn (new HistoryPrinter()).printNextItem(pw, out, now); 40760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("New history:"); 40771fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, now); 40780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 40790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 4080ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return true; 4081ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4082ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 40840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void finishIteratingOldHistoryLocked() { 40850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = false; 40860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); 40870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 40880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 40890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 40900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean startIteratingHistoryLocked() { 40910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize() 40920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " pos=" + mHistoryBuffer.dataPosition()); 40930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 40940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mReadOverflow = false; 40950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = true; 40960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return mHistoryBuffer.dataSize() > 0; 40970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 40980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 40990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 41000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean getNextHistoryLocked(HistoryItem out) { 41011fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final int pos = mHistoryBuffer.dataPosition(); 41021fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (pos == 0) { 41031fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn out.clear(); 41041fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 41051fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn boolean end = pos >= mHistoryBuffer.dataSize(); 41060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (end) { 41070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return false; 41080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 41090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 41101fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn out.readDelta(mHistoryBuffer); 41110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return true; 41120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 41130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 41140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 41150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void finishIteratingHistoryLocked() { 41160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = false; 41170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); 411832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 41195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 412032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn @Override 4121b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public long getHistoryBaseTime() { 4122b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn return mHistoryBaseTime; 4123b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 41245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4125b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn @Override 41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStartCount() { 41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartCount; 41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public boolean isScreenOn() { 41359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return mScreenOn; 41369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 41379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 41386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void initTimes() { 41396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mBatteryRealtime = mTrackBatteryPastUptime = 0; 41406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mBatteryUptime = mTrackBatteryPastRealtime = 0; 41416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 41426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 41436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 41446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 41456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4147c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn void initDischarge() { 4148c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mLowDischargeAmountSinceCharge = 0; 4149c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mHighDischargeAmountSinceCharge = 0; 4150c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOn = 0; 4151c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge = 0; 4152c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOff = 0; 4153c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge = 0; 4154c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4155c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 41566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void resetAllStatsLocked() { 41576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStartCount = 0; 41586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn initTimes(); 41599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mScreenOnTimer.reset(this, false); 41606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 41619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mScreenBrightnessTimer[i].reset(this, false); 41626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mInputEventCounter.reset(false); 41649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneOnTimer.reset(this, false); 41659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mAudioOnTimer.reset(this, false); 41669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mVideoOnTimer.reset(this, false); 41675284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 41689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneSignalStrengthsTimer[i].reset(this, false); 41696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneSignalScanningTimer.reset(this, false); 41716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 41729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneDataConnectionsTimer[i].reset(this, false); 41736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWifiOnTimer.reset(this, false); 417558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.reset(this, false); 41769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBluetoothOnTimer.reset(this, false); 41775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 41786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<mUidStats.size(); i++) { 41796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUidStats.valueAt(i).reset()) { 41806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUidStats.remove(mUidStats.keyAt(i)); 41816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn i--; 41826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 41856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mKernelWakelockStats.size() > 0) { 41866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (SamplingTimer timer : mKernelWakelockStats.values()) { 41876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(timer); 41886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mKernelWakelockStats.clear(); 41906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 4192c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn initDischarge(); 41935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 41946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn clearHistoryLocked(); 41956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 419732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) { 4198c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (oldScreenOn) { 4199c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel; 4200c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (diff > 0) { 4201c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOn += diff; 4202c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge += diff; 4203c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4204c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } else { 4205c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel; 4206c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (diff > 0) { 4207c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOff += diff; 4208c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge += diff; 4209c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4210c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4211c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (newScreenOn) { 4212c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel; 4213c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOffUnplugLevel = 0; 4214c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } else { 4215c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOnUnplugLevel = 0; 4216c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel; 4217c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4218c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4219c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 42206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void setOnBattery(boolean onBattery, int oldStatus, int level) { 42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 422232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn setOnBatteryLocked(onBattery, oldStatus, level); 422332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 422432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 422532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn 422632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn void setOnBatteryLocked(boolean onBattery, int oldStatus, int level) { 422732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn boolean doWrite = false; 422832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE); 422932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn m.arg1 = onBattery ? 1 : 0; 423032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHandler.sendMessage(m); 423132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mOnBattery = mOnBatteryInternal = onBattery; 423232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn 423332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn long uptime = SystemClock.uptimeMillis() * 1000; 423432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn long mSecRealtime = SystemClock.elapsedRealtime(); 423532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn long realtime = mSecRealtime * 1000; 423632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery) { 423732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // We will reset our status if we are unplugging after the 423832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // battery was last full, or the level is at 100, or 423932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // we have gone through a significant charge (from a very low 424032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // level to a now very high level). 424132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (oldStatus == BatteryManager.BATTERY_STATUS_FULL 424232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || level >= 90 424332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || (mDischargeCurrentLevel < 20 && level >= 80)) { 424432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn doWrite = true; 424532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn resetAllStatsLocked(); 424632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeStartLevel = level; 424732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 424832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateKernelWakelocksLocked(); 424932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 425032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 425132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: " 425232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 425332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn addHistoryRecordLocked(mSecRealtime); 425432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryUptimeStart = uptime; 425532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryRealtimeStart = realtime; 425632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime); 425732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime); 425832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeCurrentLevel = mDischargeUnplugLevel = level; 425932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mScreenOn) { 426032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOnUnplugLevel = level; 426132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOffUnplugLevel = 0; 42626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 426332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOnUnplugLevel = 0; 426432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOffUnplugLevel = level; 42656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 426632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeAmountScreenOn = 0; 426732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeAmountScreenOff = 0; 426832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime); 426932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } else { 427032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateKernelWakelocksLocked(); 427132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 427232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 427332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: " 427432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 427532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn addHistoryRecordLocked(mSecRealtime); 427632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; 427732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; 427832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeCurrentLevel = level; 427932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (level < mDischargeUnplugLevel) { 428032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1; 428132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level; 428232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 428332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn); 428432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); 428532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 428632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) { 428732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mFile != null) { 428832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn writeAsyncLocked(); 42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 42936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // This should probably be exposed in the API, though it's not critical 42946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn private static final int BATTERY_PLUGGED_NONE = 0; 42955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 42966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void setBatteryState(int status, int health, int plugType, int level, 42976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int temp, int volt) { 429832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn synchronized(this) { 429932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn boolean onBattery = plugType == BATTERY_PLUGGED_NONE; 430032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn int oldStatus = mHistoryCur.batteryStatus; 430132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (!mHaveBatteryLevel) { 430232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHaveBatteryLevel = true; 430332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // We start out assuming that the device is plugged in (not 430432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // on battery). If our first report is now that we are indeed 430532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // plugged in, then twiddle our state to correctly reflect that 430632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // since we won't be going through the full setOnBattery(). 430732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery == mOnBattery) { 430832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery) { 430932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 431032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } else { 431132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 431232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 43136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 431432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn oldStatus = status; 43156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 431632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery) { 431732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeCurrentLevel = level; 431832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mRecordingHistory = true; 43196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 432032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery != mOnBattery) { 432132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 43226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryStatus = (byte)status; 43236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryHealth = (byte)health; 43246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryPlugType = (byte)plugType; 43256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryTemperature = (char)temp; 43266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryVoltage = (char)volt; 432732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn setOnBatteryLocked(onBattery, oldStatus, level); 432832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } else { 432932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn boolean changed = false; 433032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryLevel != level) { 433132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 433232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 433332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 433432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryStatus != status) { 433532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryStatus = (byte)status; 433632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 433732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 433832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryHealth != health) { 433932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryHealth = (byte)health; 434032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 434132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 434232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryPlugType != plugType) { 434332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryPlugType = (byte)plugType; 434432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 434532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 434632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (temp >= (mHistoryCur.batteryTemperature+10) 434732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || temp <= (mHistoryCur.batteryTemperature-10)) { 434832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryTemperature = (char)temp; 434932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 435032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 435132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (volt > (mHistoryCur.batteryVoltage+20) 435232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || volt < (mHistoryCur.batteryVoltage-20)) { 435332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryVoltage = (char)volt; 435432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 435532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 435632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (changed) { 435732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 435832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 43596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 436032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) { 436132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // We don't record history while we are plugged in and fully charged. 436232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // The next time we are unplugged, history will be cleared. 436332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mRecordingHistory = false; 43646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 43656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4366633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 43675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4368c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateKernelWakelocksLocked() { 4369c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = readKernelWakelockStats(); 43705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4371d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen if (m == null) { 4372d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen // Not crashing might make board bringup easier. 43731afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "Couldn't get kernel wake lock stats"); 4374d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen return; 4375d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen } 4376d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen 4377c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) { 4378c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name = ent.getKey(); 4379c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kws = ent.getValue(); 43805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4381c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 4382c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 43835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 4384c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 4385c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 4386c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4387c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedCount(kws.mCount); 4388c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); 4389c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.setUpdateVersion(sKernelWakelockUpdateVersion); 4390c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 43915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4392c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != mKernelWakelockStats.size()) { 4393c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Set timers to stale if they didn't appear in /proc/wakelocks this time. 4394c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 4395c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer st = ent.getValue(); 4396c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) { 4397c64edde69d18498fb2954f71a546357b07ab996aEvan Millar st.setStale(); 4398c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4399c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4400c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4401c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 44029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 44049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); 44059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery(); 44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeUptime(long curTime, int which) { 44139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 44146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart); 44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastUptime; 44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mUptimeStart); 44176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart); 44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeRealtime(long curTime, int which) { 44249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 44256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart); 44269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastRealtime; 44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mRealtimeStart); 44286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart); 44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryUptime(long curTime, int which) { 44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 44366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: 44379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryUptime + getBatteryUptime(curTime); 44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastUptime; 44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(curTime); 44426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: 44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime; 44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryRealtime(long curTime, int which) { 44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 44516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: 44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryRealtime + getBatteryRealtimeLocked(curTime); 44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 44549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastRealtime; 44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 44576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: 44589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime; 44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked(long curTime) { 44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastUptime; 44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryUptimeStart; 44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked() { 44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(SystemClock.uptimeMillis() * 1000); 44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryUptime(long curTime) { 44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime); 44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryRealtimeLocked(long curTime) { 44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastRealtime; 44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryRealtimeStart; 44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryRealtime(long curTime) { 44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44923718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 44933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long getTcpBytes(long current, long[] dataBytes, int which) { 44943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (which == STATS_LAST) { 44953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 44963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 44976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 44986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) { 44993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 45003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 45016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return current - dataBytes[STATS_SINCE_UNPLUGGED]; 45023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 45046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED]; 45053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return current - dataBytes[STATS_CURRENT]; 45073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 45103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 45113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesSent(int which) { 45121719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getMobileTxBytes(), mMobileDataTx, which); 45133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 45153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 45163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesReceived(int which) { 45171719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getMobileRxBytes(), mMobileDataRx, which); 45183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 45203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 45213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesSent(int which) { 45221719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getTotalTxBytes(), mTotalDataTx, which); 45233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 45253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 45263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesReceived(int which) { 45271719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getTotalRxBytes(), mTotalDataRx, which); 45283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 4530105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 4531633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevel() { 4532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 4533633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeStartLevelLocked(); 4534105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4535105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 45365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4537633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevelLocked() { 45386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mDischargeUnplugLevel; 4539105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 45405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 4542633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevel() { 4543105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 4544633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeCurrentLevelLocked(); 4545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4546105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 45475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4548633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevelLocked() { 4549e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return mDischargeCurrentLevel; 4550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4552e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 45533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public int getLowDischargeAmountSinceCharge() { 45543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn synchronized(this) { 4555e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int val = mLowDischargeAmountSinceCharge; 4556e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) { 4557e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn val += mDischargeUnplugLevel-mDischargeCurrentLevel-1; 4558e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 4559e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return val; 45603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 45613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 45623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 45633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn @Override 45643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public int getHighDischargeAmountSinceCharge() { 45653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn synchronized(this) { 4566e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int val = mHighDischargeAmountSinceCharge; 4567e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) { 4568e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn val += mDischargeUnplugLevel-mDischargeCurrentLevel; 4569e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 4570e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return val; 45713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 45723bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 4573c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4574c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOn() { 4575c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4576c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOn; 4577c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && mScreenOn 4578c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) { 4579c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel; 4580c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4581c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4582c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4583c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4584c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4585c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOnSinceCharge() { 4586c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4587c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOnSinceCharge; 4588c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && mScreenOn 4589c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) { 4590c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel; 4591c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4592c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4593c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4594c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4595c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4596c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOff() { 4597c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4598c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOff; 4599c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && !mScreenOn 4600c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) { 4601c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel; 4602c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4603c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4604c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4605c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4606c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4607c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOffSinceCharge() { 4608c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4609c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOffSinceCharge; 4610c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && !mScreenOn 4611c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) { 4612c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel; 4613c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4614c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4615c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4616c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 46173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 46183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn @Override 4619e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public int getCpuSpeedSteps() { 4620e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return sNumSpeedSteps; 4621e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 4622e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 46239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 46249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular uid, creating if needed. 46259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid getUidStatsLocked(int uid) { 46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.get(uid); 46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u == null) { 46299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u = new Uid(uid); 46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 46319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u; 46339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the statistics object for a particular uid. 46379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeUidStatsLocked(int uid) { 46399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.remove(uid); 46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 464132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 46429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Proc getProcessStatsLocked(int uid, String name) { 46479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getProcessStatsLocked(name); 46499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 465232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * Retrieve the statistics object for a particular process, given 465332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * the name of the process. 465432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @param name process name 465532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @return the statistics object for the process 465632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani */ 4657819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani public Uid.Proc getProcessStatsLocked(String name, int pid) { 465832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani int uid; 465932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani if (mUidCache.containsKey(name)) { 466032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani uid = mUidCache.get(name); 466132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } else { 4662819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani uid = Process.getUidForPid(pid); 466332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mUidCache.put(name, uid); 466432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 466532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani Uid u = getUidStatsLocked(uid); 466632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return u.getProcessStatsLocked(name); 466732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 466832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 466932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani /** 46709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 46729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg getPackageStatsLocked(int uid, String pkg) { 46749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getPackageStatsLocked(pkg); 46769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 46809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 46819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) { 46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getServiceStatsLocked(pkg, name); 46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 468758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn /** 468858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn * Massage data to distribute any reasonable work down to more specific 468958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn * owners. Must only be called on a dead BatteryStats object! 469058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn */ 469158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void distributeWorkLocked(int which) { 469258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn // Aggregate all CPU time associated with WIFI. 469358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid wifiUid = mUidStats.get(Process.WIFI_UID); 469458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (wifiUid != null) { 469558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which); 469658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (Uid.Proc proc : wifiUid.mProcessStats.values()) { 469758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which); 469858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<mUidStats.size(); i++) { 469958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid uid = mUidStats.valueAt(i); 470058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uid.mUid != Process.WIFI_UID) { 470158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uidRunningTime = uid.getWifiRunningTime(uSecTime, which); 470258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uidRunningTime > 0) { 470358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*"); 470458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long time = proc.getUserTime(which); 470558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 470658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mUserTime += time; 470758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mUserTime -= time; 470858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = proc.getSystemTime(which); 470958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 471058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mSystemTime += time; 471158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mSystemTime -= time; 471258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = proc.getForegroundTime(which); 471358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 471458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mForegroundTime += time; 471558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mForegroundTime -= time; 471658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int sb=0; sb<proc.mSpeedBins.length; sb++) { 471758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn SamplingCounter sc = proc.mSpeedBins[sb]; 471858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (sc != null) { 471958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = sc.getCountLocked(which); 472058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 472158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn SamplingCounter uidSc = uidProc.mSpeedBins[sb]; 472258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uidSc == null) { 472358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidSc = new SamplingCounter(mUnpluggables); 472458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mSpeedBins[sb] = uidSc; 472558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 472658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidSc.mCount.addAndGet((int)time); 472758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn sc.mCount.addAndGet((int)-time); 472858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 472958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn totalRunningTime -= uidRunningTime; 473158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 47386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void shutdownLocked() { 4739ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeSyncLocked(); 47406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mShuttingDown = true; 47411afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 47425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4743ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Parcel mPendingWrite = null; 4744ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn final ReentrantLock mWriteLock = new ReentrantLock(); 4745ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4746ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void writeAsyncLocked() { 4747ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeLocked(false); 4748ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4749ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4750ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void writeSyncLocked() { 4751ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeLocked(true); 4752ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4753ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4754ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn void writeLocked(boolean sync) { 47551afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 47561afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "writeLocked: no file associated with this instance"); 47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 47589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mShuttingDown) { 47616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 47626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 47635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4764ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Parcel out = Parcel.obtain(); 4765ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeSummaryToParcel(out); 4766ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mLastWriteTime = SystemClock.elapsedRealtime(); 4767ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4768ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (mPendingWrite != null) { 4769ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite.recycle(); 4770ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4771ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite = out; 4772ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4773ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (sync) { 4774ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn commitPendingDataToDisk(); 4775ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } else { 4776ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Thread thr = new Thread("BatteryStats-Write") { 4777ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn @Override 4778ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void run() { 4779ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 4780ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn commitPendingDataToDisk(); 4781ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4782ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn }; 4783ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn thr.start(); 4784ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4785ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4786ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4787ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void commitPendingDataToDisk() { 4788f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn final Parcel next; 4789ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn synchronized (this) { 4790ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn next = mPendingWrite; 4791ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite = null; 4792f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn if (next == null) { 4793f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn return; 4794f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn } 4795ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4796ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mWriteLock.lock(); 4797ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4798ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 47999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 48001afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite()); 4801ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn stream.write(next.marshall()); 48029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.flush(); 48038bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn FileUtils.sync(stream); 48049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 48051afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile.commit(); 48069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 48071afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "Error writing battery statistics", e); 4808ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mFile.rollback(); 4809ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } finally { 4810ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn next.recycle(); 4811ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mWriteLock.unlock(); 48129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static byte[] readFully(FileInputStream stream) throws java.io.IOException { 48169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 48179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int avail = stream.available(); 48189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[avail]; 48199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 48209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int amt = stream.read(data, pos, data.length-pos); 48219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "Read " + amt + " bytes at " + pos 48229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " of avail " + data.length); 48239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt <= 0) { 48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "**** FINISHED READING: pos=" + pos 48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " len=" + data.length); 48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 48279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos += amt; 48299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project avail = stream.available(); 48309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (avail > data.length-pos) { 48319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] newData = new byte[pos+avail]; 48329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(data, 0, newData, 0, pos); 48339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = newData; 48349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readLocked() { 48391afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 48401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readLocked: no file associated with this instance"); 48419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 48429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 48459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 48471afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn File file = mFile.chooseForRead(); 48481afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (!file.exists()) { 48491afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 48509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48511afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileInputStream stream = new FileInputStream(file); 48529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] raw = readFully(stream); 48549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in = Parcel.obtain(); 48559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.unmarshall(raw, 0, raw.length); 48569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.setDataPosition(0); 48579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 48589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSummaryFromParcel(in); 48609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(java.io.IOException e) { 48611afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.e("BatteryStats", "Error reading battery statistics", e); 48629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 48640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long now = SystemClock.elapsedRealtime(); 48650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryRecordLocked(now, HistoryItem.CMD_START); 48660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(now, HistoryItem.CMD_START); 48679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 48709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 48719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 487332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn void readHistory(Parcel in) { 48740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBaseTime = in.readLong(); 48750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 48760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataSize(0); 48770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 48780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 48790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int bufSize = in.readInt(); 48800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int curPos = in.dataPosition(); 48810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) { 48820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "File corrupt: history data buffer too large " + bufSize); 48830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ((bufSize&~3) != bufSize) { 48840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "File corrupt: history data buffer not aligned " + bufSize); 48850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else { 48860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "***************** READING NEW HISTORY: " + bufSize 48870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " bytes at " + curPos); 48880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.appendFrom(in, curPos, bufSize); 48890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn in.setDataPosition(curPos + bufSize); 489032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 48915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 48920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long oldnow = SystemClock.elapsedRealtime() - (5*60*1000); 48931e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn if (oldnow > 0) { 48941e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // If the system process has restarted, but not the entire 48951e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // system, then the mHistoryBaseTime already accounts for 48961e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // much of the elapsed time. We thus want to adjust it back, 48971e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // to avoid large gaps in the data. We determine we are 48981e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // in this case by arbitrarily saying it is so if at this 48990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // point in boot the elapsed time is already more than 5 minutes. 49001e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn mHistoryBaseTime -= oldnow; 49011e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn } 490232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 49035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void readOldHistory(Parcel in) { 49050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistory = mHistoryEnd = mHistoryCache = null; 49060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long time; 49070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn while ((time=in.readLong()) >= 0) { 49080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn HistoryItem rec = new HistoryItem(time, in); 49090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryRecordLocked(rec); 49100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 49110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 49120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 491332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn void writeHistory(Parcel out) { 49140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn out.writeLong(mLastHistoryTime); 49150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn out.writeInt(mHistoryBuffer.dataSize()); 49160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: " 49170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition()); 49180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize()); 49190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 49200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 49210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void writeOldHistory(Parcel out) { 49226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem rec = mHistory; 492332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn while (rec != null) { 492432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec.time >= 0) rec.writeToParcel(out, 0); 492532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec = rec.next; 492632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 492732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn out.writeLong(-1); 492832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 49295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSummaryFromParcel(Parcel in) { 49319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int version = in.readInt(); 49329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (version != VERSION) { 49331afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readFromParcel: version got " + version 49349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", expected " + VERSION + "; erasing old stats"); 49359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 49369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 493832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn readHistory(in); 49390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn readOldHistory(in); 49405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 49429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 49439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 49459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 49466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = in.readInt(); 4947633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 49483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = in.readInt(); 49493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = in.readInt(); 4950c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge = in.readInt(); 4951c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge = in.readInt(); 49525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 49545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 49569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.readSummaryFromParcelLocked(in); 4957617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 4958617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); 4959617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4960617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.readSummaryFromParcelLocked(in); 49619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.readSummaryFromParcelLocked(in); 49635284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 4964627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in); 4965627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 4966f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in); 4967627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 4968627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in); 4969627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 4970105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 4971105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.readSummaryFromParcelLocked(in); 497258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 497358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in); 4974105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 4975105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.readSummaryFromParcelLocked(in); 49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4977c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 49781afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NKW > 10000) { 49791afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW); 49801afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 49811afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 4982c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 4983c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 4984c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String kwltName = in.readString(); 4985c64edde69d18498fb2954f71a546357b07ab996aEvan Millar getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in); 4986c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4987c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4988e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 4989e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 4990e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 49919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = in.readInt(); 49921afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NU > 10000) { 49931afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many uids " + NU); 49941afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 49951afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 49969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 49979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 49989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 49999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 50009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 500158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunning = false; 50026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 500358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunningTimer.readSummaryFromParcelLocked(in); 50046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5005105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockOut = false; 50066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); 50086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5009105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockOut = false; 50106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); 50126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 50135347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastEnabled = false; 50146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mWifiMulticastTimer.readSummaryFromParcelLocked(in); 50166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 50176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOn = false; 50186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in); 50206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 50216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOn = false; 50226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in); 50246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 50255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 5026617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() != 0) { 5027617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 5028617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.initUserActivityLocked(); 5029617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5030617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 5031617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); 5032617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5033617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 50345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 50359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = in.readInt(); 50367b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NW > 100) { 50371afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many wake locks " + NW); 50381afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 50391afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 50409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iw = 0; iw < NW; iw++) { 50419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wlName = in.readString(); 50429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 50439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in); 50449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 50469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in); 50479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 50499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in); 50509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = in.readInt(); 50547b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NP > 1000) { 50551afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many sensors " + NP); 50561afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 50571afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 50589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NP; is++) { 50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int seNumber = in.readInt(); 50609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 50619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getSensorTimerLocked(seNumber, true) 50629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .readSummaryFromParcelLocked(in); 50639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 50677b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NP > 1000) { 50681afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many processes " + NP); 50691afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 50701afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 50719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 50729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String procName = in.readString(); 50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc p = u.getProcessStatsLocked(procName); 50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mUserTime = p.mLoadedUserTime = in.readLong(); 50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mSystemTime = p.mLoadedSystemTime = in.readLong(); 50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStarts = p.mLoadedStarts = in.readInt(); 507758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int NSB = in.readInt(); 50787b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NSB > 100) { 50797b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn Slog.w(TAG, "File corrupt: too many speed bins " + NSB); 50807b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return; 50817b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 508258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins = new SamplingCounter[NSB]; 508358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<NSB; i++) { 508458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (in.readInt() != 0) { 508558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins[i] = new SamplingCounter(mUnpluggables); 508658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins[i].readSummaryFromParcelLocked(in); 508758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 508858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 50897b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (!p.readExcessivePowerFromParcelLocked(in)) { 50907b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return; 50917b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 50951afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NP > 10000) { 50961afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many packages " + NP); 50971afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 50981afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = in.readString(); 51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg p = u.getPackageStatsLocked(pkgName); 51029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mWakeups = p.mLoadedWakeups = in.readInt(); 51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = in.readInt(); 51047b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NS > 1000) { 51057b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn Slog.w(TAG, "File corrupt: too many services " + NS); 51067b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return; 51077b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 51089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NS; is++) { 51099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String servName = in.readString(); 51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); 51119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStartTime = s.mLoadedStartTime = in.readLong(); 51129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStarts = s.mLoadedStarts = in.readInt(); 51139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLaunches = s.mLoadedLaunches = in.readInt(); 51149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesReceived = in.readLong(); 51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesSent = in.readLong(); 51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a summary of the statistics to a Parcel, in a format suitable to be written to 51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disk. This format does not allow a lossless round-trip. 51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 51279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeSummaryToParcel(Parcel out) { 51290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Need to update with current kernel wake lock counts. 51300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn updateKernelWakelocksLocked(); 51310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW_SYS = SystemClock.uptimeMillis() * 1000; 51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000; 51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW = getBatteryUptimeLocked(NOW_SYS); 51359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS); 51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(VERSION); 51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 513932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn writeHistory(out); 51400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn writeOldHistory(out); 51415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 51436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED)); 51446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); 51456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED)); 51466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); 51476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(mDischargeUnplugLevel); 5148633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 5149e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn out.writeInt(getLowDischargeAmountSinceCharge()); 5150e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn out.writeInt(getHighDischargeAmountSinceCharge()); 5151c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(getDischargeAmountScreenOnSinceCharge()); 5152c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(getDischargeAmountScreenOffSinceCharge()); 51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5155617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 5156617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 5157617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5158617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeSummaryFromParcelLocked(out); 51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 51605284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 5161627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 5162627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5163f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5164627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 5165627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 5166627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5167105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 516858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5169105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5171c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 5172c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 5173c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer kwlt = ent.getValue(); 5174c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 5175c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 5176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 5177c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL); 5178c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 5179c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 5180c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 51825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5183e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 51849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = mUidStats.size(); 51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NU); 51869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(iu)); 51889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 51895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 519058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (u.mWifiRunningTimer != null) { 51916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 519258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 51936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 51946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 51956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 51966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mFullWifiLockTimer != null) { 51976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 51986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 51996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mScanWifiLockTimer != null) { 52036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 52046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mWifiMulticastTimer != null) { 52096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 52106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mAudioTurnedOnTimer != null) { 52156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 52166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mVideoTurnedOnTimer != null) { 52216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 52226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 5228617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 5229617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 5230617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 5231617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 5232617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); 5233617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5234617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 52355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = u.mWakelockStats.size(); 52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NW); 52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent 52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mWakelockStats.entrySet()) { 52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerFull != null) { 52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL); 52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerPartial != null) { 52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL); 52529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerWindow != null) { 52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL); 52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 52599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NSE = u.mSensorStats.size(); 52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NSE); 52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NSE > 0) { 52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent 52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mSensorStats.entrySet()) { 52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ent.getKey()); 52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se.mTimer != null) { 52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = u.mProcessStats.size(); 52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent 52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mProcessStats.entrySet()) { 52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime); 52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime); 52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts); 529058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final int N = ps.mSpeedBins.length; 529158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(N); 529258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 529358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (ps.mSpeedBins[i] != null) { 529458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(1); 529558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn ps.mSpeedBins[i].writeSummaryFromParcelLocked(out); 529658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 529758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(0); 529858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 529958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 5300287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ps.writeExcessivePowerToParcelLocked(out); 53019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = u.mPackageStats.size(); 53059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 53069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 53079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent 53089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mPackageStats.entrySet()) { 53099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 53109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 53119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups); 53129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = ps.mServiceStats.size(); 53139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NS); 53149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NS > 0) { 53159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent 53169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : ps.mServiceStats.entrySet()) { 53179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(sent.getKey()); 53189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue(); 53199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = ss.getStartTimeToNowLocked(NOW); 53209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time); 53219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts); 53229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches); 53239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 53286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED)); 53296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED)); 53309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readFromParcel(Parcel in) { 53349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcelLocked(in); 53359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 53379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 53389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = in.readInt(); 53399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != MAGIC) { 53409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ParcelFormatException("Bad magic number"); 53419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 534332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn readHistory(in); 53445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 53473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mBatteryLastUptime = 0; 53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 53493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mBatteryLastRealtime = 0; 53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 53510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in); 5352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 53530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, 53540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables, in); 53579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 53580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 53595284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 53600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, 53610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5362627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 53630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in); 5364627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 53650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, 53660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5367627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5368105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 53690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 537058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 537158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 5372105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 53730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 53749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 53759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = in.readLong(); 53763bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastUptime = 0; 53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = in.readLong(); 53793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastRealtime = 0; 53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = in.readInt() != 0; 53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBatteryInternal = false; // we are no longer really running. 53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = in.readLong(); 53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = in.readLong(); 53849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = in.readLong(); 53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = in.readLong(); 53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = in.readLong(); 53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = in.readLong(); 53886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = in.readInt(); 5389633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 53903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = in.readInt(); 53913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = in.readInt(); 5392c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOn = in.readInt(); 5393c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge = in.readInt(); 5394c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOff = in.readInt(); 5395c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge = in.readInt(); 53969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = in.readLong(); 53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataRx[STATS_LAST] = in.readLong(); 53996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1; 54003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataTx[STATS_LAST] = in.readLong(); 54016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1; 54023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataRx[STATS_LAST] = in.readLong(); 54036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1; 54043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataTx[STATS_LAST] = in.readLong(); 54056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1; 54063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 54073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = in.readLong(); 54083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 54093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 54103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = in.readInt(); 54113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 54123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 5413c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.clear(); 5414c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 5415c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 5416c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 5417c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String wakelockName = in.readString(); 5418244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel 5419c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); 5420c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(wakelockName, kwlt); 5421c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5422c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 54235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers.clear(); 54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers.clear(); 54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers.clear(); 542758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers.clear(); 542858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers.clear(); 542958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers.clear(); 543058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers.clear(); 54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5432e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 5433e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 54349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numUids = in.readInt(); 54359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 54369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numUids; i++) { 54379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 54389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 54399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.readFromParcelLocked(mUnpluggables, in); 54409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.append(uid, u); 54419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 54453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn writeToParcelLocked(out, true, flags); 54463bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 54473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 54483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public void writeToParcelWithoutUids(Parcel out, int flags) { 54493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn writeToParcelLocked(out, false, flags); 54509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 54525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @SuppressWarnings("unused") 54533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn void writeToParcelLocked(Parcel out, boolean inclUids, int flags) { 54540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Need to update with current kernel wake lock counts. 54550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn updateKernelWakelocksLocked(); 54560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecUptime = SystemClock.uptimeMillis() * 1000; 54589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 54599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptimeLocked(uSecUptime); 54609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 54615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(MAGIC); 54635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 546432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn writeHistory(out); 54655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 54669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 54679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryUptime); 54689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryRealtime); 54699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeToParcel(out, batteryRealtime); 5470617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 5471617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime); 5472617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5473617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeToParcel(out); 54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeToParcel(out, batteryRealtime); 54755284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 5476627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime); 5477627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5478f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime); 5479627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 5480627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime); 5481627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5482105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeToParcel(out, batteryRealtime); 548358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime); 5484105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeToParcel(out, batteryRealtime); 54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptime); 54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptimeStart); 54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtime); 54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtimeStart); 54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mOnBattery ? 1 : 0); 54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryUptime); 54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryUptimeStart); 54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryRealtime); 54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryRealtimeStart); 54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryUptime); 54959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryRealtime); 54966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(mDischargeUnplugLevel); 5497633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 54983bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mLowDischargeAmountSinceCharge); 54993bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mHighDischargeAmountSinceCharge); 5500c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOn); 5501c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOnSinceCharge); 5502c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOff); 5503c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOffSinceCharge); 55049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastWriteTime); 55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED)); 55076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED)); 55086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED)); 55096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED)); 55103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 55113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Write radio uptime for data 55123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeLong(getRadioDataUptime()); 55133f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 55143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeInt(getBluetoothPingCount()); 55153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 55163bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (inclUids) { 55173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mKernelWakelockStats.size()); 55183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 55193bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn SamplingTimer kwlt = ent.getValue(); 55203bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (kwlt != null) { 55213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(1); 55223bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeString(ent.getKey()); 55233bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn Timer.writeTimerToParcel(out, kwlt, batteryRealtime); 55243bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 55253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 55263bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 5527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 55283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 55293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 5530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5531e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 5532e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 5533e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 55343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (inclUids) { 55353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int size = mUidStats.size(); 55363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(size); 55373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn for (int i = 0; i < size; i++) { 55383bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mUidStats.keyAt(i)); 55393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn Uid uid = mUidStats.valueAt(i); 55409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn uid.writeToParcelLocked(out, batteryRealtime); 55423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 55433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 55443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 55459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<BatteryStatsImpl> CREATOR = 55499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<BatteryStatsImpl>() { 55509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl createFromParcel(Parcel in) { 55519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl(in); 55529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl[] newArray(int size) { 55559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl[size]; 55569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 55585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 55590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void prepareForDumpLocked() { 55600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Need to retrieve current kernel wake lock stats before printing. 55610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn updateKernelWakelocksLocked(); 55620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 55630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 55641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void dumpLocked(PrintWriter pw) { 55659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) { 55661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 55671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen timer:"); 55681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenOnTimer.logState(pr, " "); 5569617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 55701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen brightness #" + i + ":"); 55711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenBrightnessTimer[i].logState(pr, " "); 5572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 55731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Input event counter:"); 55741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mInputEventCounter.logState(pr, " "); 55751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Phone timer:"); 55761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneOnTimer.logState(pr, " "); 55775284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 55781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Signal strength #" + i + ":"); 55791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneSignalStrengthsTimer[i].logState(pr, " "); 5580627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5581f37447bad3773b62176baa837908daf6edb44273Amith Yamasani pr.println("*** Signal scanning :"); 5582f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.logState(pr, " "); 5583627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 55841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Data connection type #" + i + ":"); 55851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneDataConnectionsTimer[i].logState(pr, " "); 55861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 55871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Wifi timer:"); 55881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiOnTimer.logState(pr, " "); 55891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** WifiRunning timer:"); 559058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.logState(pr, " "); 55911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Bluetooth timer:"); 55921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mBluetoothOnTimer.logState(pr, " "); 55939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dumpLocked(pw); 55959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5597