BatteryStatsImpl.java revision ae3844527a305cef8bbd1c895b79be45a6c51dbc
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; 44ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackbornimport android.util.TimeUtils; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 55c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator; 565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganeshimport java.util.List; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 584cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger; 59ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackbornimport java.util.concurrent.locks.ReentrantLock; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. All times are represented in microseconds except where indicated 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "BatteryStatsImpl"; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG = false; 6932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn private static final boolean DEBUG_HISTORY = false; 705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh private static final int MAGIC = 0xBA757475; // 'BATSTATS' 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Current on-disk Parcel version 751fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn private static final int VERSION = 60; 76e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // Maximum number of items we will record in the history. 787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private static final int MAX_HISTORY_ITEMS = 2000; 795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 80f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // No, really, THIS is the maximum number of items we will record in the history. 81f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn private static final int MAX_MAX_HISTORY_ITEMS = 3000; 82f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 839e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // The maximum number of names wakelocks we will keep track of 849e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // per uid; once the limit is reached, we batch the remaining wakelocks 859e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // in to one common name. 867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private static final int MAX_WAKELOCKS_PER_UID = 30; 875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 889e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn private static final String BATCHED_WAKELOCK_NAME = "*overflow*"; 895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 90e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani private static int sNumSpeedSteps; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 921afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn private final JournaledFile mFile; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn static final int MSG_UPDATE_WAKELOCKS = 1; 950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn static final int MSG_REPORT_POWER_CHANGE = 2; 96287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final long DELAY_UPDATE_WAKELOCKS = 5*1000; 970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public interface BatteryCallback { 990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void batteryNeedsCpuUpdate(); 1000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void batteryPowerChanged(boolean onBattery); 1010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final class MyHandler extends Handler { 1040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn @Override 1050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void handleMessage(Message msg) { 1060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn BatteryCallback cb = mCallback; 1070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn switch (msg.what) { 1080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn case MSG_UPDATE_WAKELOCKS: 1090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (cb != null) { 1100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn cb.batteryNeedsCpuUpdate(); 1110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn break; 1130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn case MSG_REPORT_POWER_CHANGE: 1140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (cb != null) { 1150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn cb.batteryPowerChanged(msg.arg1 != 0); 1160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn break; 1180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn private final MyHandler mHandler; 1230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn private BatteryCallback mCallback; 1250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected organized by uids. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SparseArray<BatteryStatsImpl.Uid> mUidStats = 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SparseArray<BatteryStatsImpl.Uid>(); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A set of pools of currently active timers. When a timer is queried, we will divide the 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // elapsed time by the number of active timers to arrive at that timer's share of the time. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In order to do this, we must refresh each timer whenever the number of active timers 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes. 136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>(); 137c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>(); 138c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>(); 139c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers 140c64edde69d18498fb2954f71a546357b07ab996aEvan Millar = new SparseArray<ArrayList<StopwatchTimer>>(); 14158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>(); 14258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>(); 14358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mScanWifiLockTimers = new ArrayList<StopwatchTimer>(); 14458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // Last partial timers we use for distributing CPU usage. 1470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>(); 1480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are the objects that will want to do something when the device 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is unplugged from power. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>(); 1525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mShuttingDown; 1545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long mHistoryBaseTime; 1566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mHaveBatteryLevel = false; 1576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mRecordingHistory = true; 1586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int mNumHistoryItems; 1590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int MAX_HISTORY_BUFFER = 128*1024; // 128KB 1611fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int MAX_MAX_HISTORY_BUFFER = 144*1024; // 144KB 1620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final Parcel mHistoryBuffer = Parcel.obtain(); 1630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final HistoryItem mHistoryLastWritten = new HistoryItem(); 1640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final HistoryItem mHistoryLastLastWritten = new HistoryItem(); 1651fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final HistoryItem mHistoryReadTmp = new HistoryItem(); 1660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int mHistoryBufferLastPos = -1; 1670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean mHistoryOverflow = false; 1680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long mLastHistoryTime = 0; 1690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final HistoryItem mHistoryCur = new HistoryItem(); 1710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistory; 1736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistoryEnd; 1749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn HistoryItem mHistoryLastEnd; 1756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistoryCache; 1760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private HistoryItem mHistoryIterator; 1780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private boolean mReadOverflow; 1790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private boolean mIteratingHistory; 1805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStartCount; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryUptime; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastUptime; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryRealtime; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastRealtime; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptime; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptimeStart; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUptime; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtime; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtimeStart; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastRealtime; 1945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mScreenOn; 196c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScreenOnTimer; 1973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mScreenBrightnessBin = -1; 199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; 2005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 201617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter mInputEventCounter; 2025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mPhoneOn; 204c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mPhoneOnTimer; 2055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 206244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioOn; 207244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioOnTimer; 2085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 209244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoOn; 210244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoOnTimer; 2115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 212627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneSignalStrengthBin = -1; 213e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int mPhoneSignalStrengthBinRaw = -1; 214c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneSignalStrengthsTimer = 2155284090631e638b916d9a453212e9dc802656a67Wink Saville new StopwatchTimer[SignalStrength.NUM_SIGNAL_STRENGTH_BINS]; 216f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 217f37447bad3773b62176baa837908daf6edb44273Amith Yamasani StopwatchTimer mPhoneSignalScanningTimer; 218f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 219627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneDataConnectionType = -1; 2205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh final StopwatchTimer[] mPhoneDataConnectionsTimer = 221c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_DATA_CONNECTION_TYPES]; 2225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 223105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mWifiOn; 224c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiOnTimer; 225617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mWifiOnUid = -1; 226d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 22758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn boolean mGlobalWifiRunning; 22858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn StopwatchTimer mGlobalWifiRunningTimer; 2295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 230105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mBluetoothOn; 231c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mBluetoothOnTimer; 2323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 2333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** Bluetooth headset object */ 2343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani BluetoothHeadset mBtHeadset; 2353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These provide time bases that discount the time the device is plugged 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in to power. 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBattery; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBatteryInternal; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastUptime; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryUptimeStart; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastRealtime; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryRealtimeStart; 2463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryUptime; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryRealtime; 2493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /* 251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * These keep track of battery levels (1-100) at the last plug event and the last unplug event. 252105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 253633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeStartLevel; 2546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int mDischargeUnplugLevel; 255633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeCurrentLevel; 2563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int mLowDischargeAmountSinceCharge; 2573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int mHighDischargeAmountSinceCharge; 258c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeScreenOnUnplugLevel; 259c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeScreenOffUnplugLevel; 260c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOn; 261c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOnSinceCharge; 262c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOff; 263c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOffSinceCharge; 264244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastWriteTime = 0; // Milliseconds 266244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Mobile data transferred while on battery 2683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataTx = new long[4]; 2693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataRx = new long[4]; 2703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataTx = new long[4]; 2713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataRx = new long[4]; 2723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataUptime; 2743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataStart; 2753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2763f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingCount; 2773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingStart = -1; 2783f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 279f37447bad3773b62176baa837908daf6edb44273Amith Yamasani private int mPhoneServiceState = -1; 280e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private int mPhoneServiceStateRaw = -1; 281e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private int mPhoneSimStateRaw = -1; 282f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 283c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 284c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Holds a SamplingTimer associated with each kernel wakelock name being tracked. 285c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 2865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh private final HashMap<String, SamplingTimer> mKernelWakelockStats = 287c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, SamplingTimer>(); 2885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 289c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public Map<String, ? extends SamplingTimer> getKernelWakelockStats() { 290c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mKernelWakelockStats; 291c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 293c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static int sKernelWakelockUpdateVersion = 0; 2945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 295c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static final int[] PROC_WAKELOCKS_FORMAT = new int[] { 296c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_STRING, // 0: name 297c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 1: count 298c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 299c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 300c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 301c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 5: totalTime 302c64edde69d18498fb2954f71a546357b07ab996aEvan Millar }; 3035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 304c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final String[] mProcWakelocksName = new String[3]; 305c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final long[] mProcWakelocksData = new long[3]; 3065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 307c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added 309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * to mKernelWakelockStats. 310c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 3115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh private final Map<String, KernelWakelockStats> mProcWakelockFileStats = 312c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, KernelWakelockStats>(); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>(); 3155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For debugging 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl() { 3181afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 3190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = null; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface Unpluggable { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unplug(long batteryUptime, long batteryRealtime); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void plug(long batteryUptime, long batteryRealtime); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 328617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * State for keeping track of counting information. 329617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 330e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class Counter extends BatteryStats.Counter implements Unpluggable { 3314cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate final AtomicInteger mCount = new AtomicInteger(); 3326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn final ArrayList<Unpluggable> mUnpluggables; 333617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLoadedCount; 334617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLastCount; 335617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mUnpluggedCount; 336617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mPluggedCount; 3375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 338617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables, Parcel in) { 3396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 3404cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = in.readInt(); 3414cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 342617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLoadedCount = in.readInt(); 3433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 344617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = in.readInt(); 345617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 346617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 348617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables) { 3496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 353617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void writeToParcel(Parcel out) { 3544cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(mCount.get()); 355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLoadedCount); 356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mUnpluggedCount); 357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 358617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 359617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void unplug(long batteryUptime, long batteryRealtime) { 3604cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount; 3614cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 362617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void plug(long batteryUptime, long batteryRealtime) { 3654cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = mCount.get(); 366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * Writes a possibly null Counter to a Parcel. 370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param out the Parcel to be written to. 372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param counter a Counter, or null. 373617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static void writeCounterToParcel(Parcel out, Counter counter) { 375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (counter == null) { 376617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); // indicates null 377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return; 378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 379617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); // indicates non-null 380617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn counter.writeToParcel(out); 382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 384617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 385c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int val; 387617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_LAST) { 388617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val = mLastCount; 389617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 3904cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate val = mCount.get(); 3916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 392617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mUnpluggedCount; 3936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mLoadedCount; 395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return val; 399617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 400617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 401617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void logState(Printer pw, String prefix) { 4024cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate pw.println(prefix + "mCount=" + mCount.get() 403617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 404617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mUnpluggedCount=" + mUnpluggedCount 405617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mPluggedCount=" + mPluggedCount); 406617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4084cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate void stepAtomic() { 4094cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.incrementAndGet(); 410617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 411617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 4126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 4136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear state of this counter. 4146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 4156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void reset(boolean detachIfReset) { 4166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCount.set(0); 4176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0; 4186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (detachIfReset) { 4196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn detach(); 4206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 4246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 4256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 427617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void writeSummaryFromParcelLocked(Parcel out) { 4284cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate int count = mCount.get(); 4294cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(count); 430617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 432617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void readSummaryFromParcelLocked(Parcel in) { 4334cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mLoadedCount = in.readInt(); 4344cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mLoadedCount); 4353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 4364cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount = mLoadedCount; 437617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 438617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 439e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 440e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class SamplingCounter extends Counter { 441e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 442e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) { 443e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables, in); 444e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 445e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 446e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables) { 447e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables); 448e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 449e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 4504cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void addCountAtomic(long count) { 4514cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.addAndGet((int)count); 452e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 453e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 454e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 455617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for keeping track of timing information. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 458c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static abstract class Timer extends BatteryStats.Timer implements Unpluggable { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mType; 4606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn final ArrayList<Unpluggable> mUnpluggables; 4615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedCount; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastCount; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedCount; 4665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Times are in microseconds for better accuracy when dividing by the 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock count, and are in "battery realtime" units. 4695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we have accumulated since the start of the original 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * boot, to the last time something interesting happened in the 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current run. 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTotalTime; 4765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we loaded for the previous runs. Subtract this from 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mTotalTime to find the time for the current run of the system. 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTime; 4825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The run time of the last run of the system, as loaded from the 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved data. 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastTime; 4885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value of mTotalTime when unplug() was last called. Subtract 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this from mTotalTime to find the time since the last unplug from 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * power. 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedTime; 4955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 496244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani /** 497244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * Constructs from a parcel. 498244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param type 499244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param unpluggables 500244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param powerType 501244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param in 502244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani */ 503c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 5056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 5065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount = in.readInt(); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedCount = in.readInt(); 5093bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = in.readInt(); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = in.readLong(); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTime = in.readLong(); 5133bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastTime = 0; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = in.readLong(); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables) { 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 5206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract long computeRunTimeLocked(long curBatteryRealtime); 5255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract int computeCurrentCountLocked(); 5275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 5296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear state of this timer. Returns true if the timer is inactive 5306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * so can be completely dropped. 5316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 5329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 5336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalTime = mLoadedTime = mLastTime = 0; 5346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCount = mLoadedCount = mLastCount = 0; 5356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (detachIfReset) { 5366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn detach(); 5376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 5396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 5426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 5436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, long batteryRealtime) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mCount); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedCount); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedCount); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRunTimeLocked(batteryRealtime)); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTime); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedTime); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedTime=" + mUnpluggedTime 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedCount=" + mUnpluggedCount); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = computeRunTimeLocked(batteryRealtime); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = mCount; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": new mUnpluggedTime=" + mUnpluggedTime 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new mUnpluggedCount=" + mUnpluggedCount); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime 572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " old mTotalTime=" + mTotalTime); 573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = computeRunTimeLocked(batteryRealtime); 575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = computeCurrentCountLocked(); 576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType 578c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + ": new mTotalTime=" + mTotalTime); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a possibly null Timer to a Parcel. 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer, or null. 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void writeTimerToParcel(Parcel out, Timer timer, 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime) { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer == null) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); // indicates null 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); // indicates non-null 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timer.writeToParcel(out, batteryRealtime); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long getTotalTimeLocked(long batteryRealtime, int which) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastTime; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = computeRunTimeLocked(batteryRealtime); 6066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedTime; 6086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedTime; 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastCount; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar val = computeCurrentCountLocked(); 6236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedCount; 6256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedCount; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 633627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void logState(Printer pw, String prefix) { 634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + " mCount=" + mCount 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedCount=" + mUnpluggedCount); 637627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mTotalTime=" + mTotalTime 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedTime=" + mLoadedTime); 639627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mLastTime=" + mLastTime 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedTime=" + mUnpluggedTime); 641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 6425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 6435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long runTime = computeRunTimeLocked(batteryRealtime); 646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Divide by 1000 for backwards compatibility 647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong((runTime + 500) / 1000); 648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount); 649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Multiply by 1000 for backwards compatibility 653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = mLoadedTime = in.readLong() * 1000; 6543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastTime = 0; 655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedTime = mTotalTime; 656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = mLoadedCount = in.readInt(); 6573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedCount = mCount; 659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 6615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class SamplingTimer extends Timer { 6635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported count from /proc/wakelocks. 666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mCurrentReportedCount; 668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported count from /proc/wakelocks when unplug() was last 671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUnpluggedReportedCount; 674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported total_time from /proc/wakelocks. 6775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh */ 678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mCurrentReportedTotalTime; 679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported total_time from /proc/wakelocks when unplug() was last 683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUnpluggedReportedTotalTime; 686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently in a discharge cycle. 689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mInDischarge; 691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently recording reported values. 694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mTrackingReportedValues; 6965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * A sequnce counter, incremented once for each update of the stats. 699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUpdateVersion; 7015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) { 703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables, in); 704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = in.readInt(); 705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = in.readInt(); 706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = in.readLong(); 707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = in.readLong(); 708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 710c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 7125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, 713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean trackReportedValues) { 714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables); 715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = trackReportedValues; 716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setStale() { 720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = false; 721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = 0; 722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = 0; 723c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setUpdateVersion(int version) { 726c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateVersion = version; 727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getUpdateVersion() { 730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUpdateVersion; 731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedCount(int count) { 734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedCount == 0) { 735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = count; 737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = count; 741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedTotalTime(long totalTime) { 744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedTotalTime == 0) { 745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = totalTime; 747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 750c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = totalTime; 751c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void unplug(long batteryUptime, long batteryRealtime) { 754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.unplug(batteryUptime, batteryRealtime); 755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mTrackingReportedValues) { 756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime; 757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount; 758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = true; 760c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 764c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = false; 765c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 768c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 7695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount 770c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedCount=" + mUnpluggedReportedCount 771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime 772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime); 773c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 775c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 7765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh return mTotalTime + (mInDischarge && mTrackingReportedValues 777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0); 778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount + (mInDischarge && mTrackingReportedValues 782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedCount - mUnpluggedReportedCount : 0); 783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mUnpluggedReportedCount); 789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUnpluggedReportedTotalTime); 791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 792c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 7949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 7959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.reset(stats, detachIfReset); 7966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn setStale(); 7976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 7986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 7995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeSummaryFromParcelLocked(out, batteryRealtime); 802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong(); 810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount = in.readInt(); 811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 8145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * State for keeping track of timing information. 817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class StopwatchTimer extends Timer { 8190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final Uid mUid; 820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mTimerPool; 8210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mNesting; 823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The last time at which we updated the timer. If mNesting is > 0, 826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * subtract this from the current battery time to find the amount of 827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * time we have been running since we last computed an update. 828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUpdateTime; 8305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 8329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn * The total time at which the timer was acquired, to determine if it 833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * was actually held for an interesting duration. 834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mAcquireTime; 836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 837f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long mTimeout; 838f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 8390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn /** 8400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn * For partial wake locks, keep track of whether we are in the list 8410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn * to consume CPU cycles. 8420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn */ 8430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn boolean mInList; 8440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 8450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool, 846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables, Parcel in) { 847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables, in); 8480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mUid = uid; 849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = in.readLong(); 851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 8530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool, 854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables) { 855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables); 8560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mUid = uid; 857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 8595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 860f37447bad3773b62176baa837908daf6edb44273Amith Yamasani void setTimeout(long timeout) { 861f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mTimeout = timeout; 862f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 863f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUpdateTime); 867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mNesting > 0) { 871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "old mUpdateTime=" + mUpdateTime); 873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = batteryRealtime; 876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "new mUpdateTime=" + mUpdateTime); 878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startRunningLocked(BatteryStatsImpl stats) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting++ == 0) { 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUpdateTime = stats.getBatteryRealtimeLocked( 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.elapsedRealtime() * 1000); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all currently active timers before adding 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this new one to the pool. 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add this timer to the active pool 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.add(this); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Increment the count 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount++; 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAcquireTime = mTotalTime; 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 91032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani boolean isRunningLocked() { 91132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return mNesting > 0; 91232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 91332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopRunningLocked(BatteryStatsImpl stats) { 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore attempt to stop a timer that isn't running 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting == 0) { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (--mNesting == 0) { 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all active counters, scaled by the total 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // active in the pool, before taking this one out of the pool. 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove this timer from the active pool 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.remove(this); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh final long realtime = SystemClock.elapsedRealtime() * 1000; 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 1; 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = computeRunTimeLocked(batteryRealtime); 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTotalTime == mAcquireTime) { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there was no change in the time, then discard this 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // count. A somewhat cheezy strategy, but hey. 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount--; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update the total time for all other running Timers with the same type as this Timer 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // due to a change in timer count 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void refreshTimersLocked(final BatteryStatsImpl stats, 951c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> pool) { 9525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh final long realtime = SystemClock.elapsedRealtime() * 1000; 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = pool.size(); 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>= 0; i--) { 956c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer t = pool.get(i); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long heldTime = batteryRealtime - t.mUpdateTime; 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (heldTime > 0) { 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mTotalTime += heldTime / N; 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mUpdateTime = batteryRealtime; 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 965c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 966c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 967f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) { 968f37447bad3773b62176baa837908daf6edb44273Amith Yamasani curBatteryRealtime = mUpdateTime + mTimeout; 969f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTotalTime + (mNesting > 0 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (curBatteryRealtime - mUpdateTime) 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project / (mTimerPool != null ? mTimerPool.size() : 1) 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : 0); 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 976c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 977c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 978c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 9826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean canDetach = mNesting <= 0; 9839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.reset(stats, canDetach && detachIfReset); 9849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mNesting > 0) { 9859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mUpdateTime = stats.getBatteryRealtimeLocked( 9869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn SystemClock.elapsedRealtime() * 1000); 9879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 9889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mAcquireTime = mTotalTime; 9896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return canDetach; 9906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 9915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 9926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 9936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn super.detach(); 9946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPool != null) { 9956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPool.remove(this); 9966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 9976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 9985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readSummaryFromParcelLocked(Parcel in) { 1000c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1005c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> readKernelWakelockStats() { 10065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 10073372f2e259247810627fd22033406163284f4f64Johannes Carlsson byte[] buffer = new byte[8192]; 1008c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int len; 10095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1010c64edde69d18498fb2954f71a546357b07ab996aEvan Millar try { 1011c64edde69d18498fb2954f71a546357b07ab996aEvan Millar FileInputStream is = new FileInputStream("/proc/wakelocks"); 1012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = is.read(buffer); 1013c64edde69d18498fb2954f71a546357b07ab996aEvan Millar is.close(); 1014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1015c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (len > 0) { 1016c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 1017c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i=0; i<len; i++) { 1018c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (buffer[i] == '\0') { 1019c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = i; 1020c64edde69d18498fb2954f71a546357b07ab996aEvan Millar break; 1021c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1022c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1024c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.FileNotFoundException e) { 1025c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 1026c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.IOException e) { 1027c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 1028c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 10295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return parseProcWakelocks(buffer, len); 1031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 10325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> parseProcWakelocks( 1034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] wlBuffer, int len) { 1035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name; 1036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count; 1037c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long totalTime; 1038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int startIndex, endIndex; 1039c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int numUpdatedWlNames = 0; 1040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Advance past the first line. 1042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 1043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++); 1044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex = i + 1; 1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1046c64edde69d18498fb2954f71a546357b07ab996aEvan Millar synchronized(this) { 1047c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = mProcWakelockFileStats; 10485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1049c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion++; 1050c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (endIndex < len) { 10515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh for (endIndex=startIndex; 10525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0'; 1053c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex++); 10543372f2e259247810627fd22033406163284f4f64Johannes Carlsson endIndex++; // endIndex is an exclusive upper bound. 10553372f2e259247810627fd22033406163284f4f64Johannes Carlsson // Don't go over the end of the buffer, Process.parseProcLine might 10563372f2e259247810627fd22033406163284f4f64Johannes Carlsson // write to wlBuffer[endIndex] 10573372f2e259247810627fd22033406163284f4f64Johannes Carlsson if (endIndex >= (len - 1) ) { 10583372f2e259247810627fd22033406163284f4f64Johannes Carlsson return m; 1059e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani } 1060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1061c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String[] nameStringArray = mProcWakelocksName; 1062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long[] wlData = mProcWakelocksData; 10632098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // Stomp out any bad characters since this is from a circular buffer 10642098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // A corruption is seen sometimes that results in the vm crashing 10652098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // This should prevent crashes and the line will probably fail to parse 10662098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani for (int j = startIndex; j < endIndex; j++) { 10672098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?'; 10682098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani } 106953b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex, 107053b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null); 10712098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani 1072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar name = nameStringArray[0]; 1073c64edde69d18498fb2954f71a546357b07ab996aEvan Millar count = (int) wlData[1]; 1074c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // convert nanoseconds to microseconds with rounding. 1075c64edde69d18498fb2954f71a546357b07ab996aEvan Millar totalTime = (wlData[2] + 500) / 1000; 1076c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 107753b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani if (parsed && name.length() > 0) { 1078c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (!m.containsKey(name)) { 10795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh m.put(name, new KernelWakelockStats(count, totalTime, 1080c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion)); 1081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 1082c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 1083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kwlStats = m.get(name); 1084c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlStats.mVersion == sKernelWakelockUpdateVersion) { 1085c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount += count; 1086c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime += totalTime; 1087c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 1088c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount = count; 1089c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime = totalTime; 1090c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mVersion = sKernelWakelockUpdateVersion; 1091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 1092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1093c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 109453b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani } 1095c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex; 1096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1098c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != numUpdatedWlNames) { 1099c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Don't report old data. 1100c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Iterator<KernelWakelockStats> itr = m.values().iterator(); 1101c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (itr.hasNext()) { 1102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (itr.next().mVersion != sKernelWakelockUpdateVersion) { 1103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar itr.remove(); 1104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1106c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1107c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return m; 1108c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1109c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 11105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1111c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private class KernelWakelockStats { 1112c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mCount; 1113c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long mTotalTime; 1114c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mVersion; 11155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats(int count, long totalTime, int version) { 1117c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = count; 1118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = totalTime; 1119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mVersion = version; 1120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 11225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1123c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 11245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh * Get the KernelWakelockTimer associated with name, and create a new one if one 1125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * doesn't already exist. 1126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 1127c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public SamplingTimer getKernelWakelockTimerLocked(String name) { 1128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 1129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 11305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 1131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 1132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 1133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1134c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return kwlt; 1135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 11363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataPlug(long[] dataTransfer, long currentBytes) { 11386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_LAST] = dataTransfer[STATS_SINCE_UNPLUGGED]; 11396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_SINCE_UNPLUGGED] = -1; 11403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataUnplug(long[] dataTransfer, long currentBytes) { 11436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_SINCE_UNPLUGGED] = currentBytes; 11443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 11473f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Radio uptime in microseconds when transferring data. This value is very approximate. 11483f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @return 11493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 11503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private long getCurrentRadioDataUptime() { 11513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani try { 11523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms"); 11533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (!awakeTimeFile.exists()) return 0; 11543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile)); 11553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani String line = br.readLine(); 11563718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani br.close(); 11573f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return Long.parseLong(line) * 1000; 11583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (NumberFormatException nfe) { 11593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 11603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (IOException ioe) { 11613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 11623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return 0; 11643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11663f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 11673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @deprecated use getRadioDataUptime 11683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 11693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getRadioDataUptimeMs() { 11703f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getRadioDataUptime() / 1000; 11713f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11723f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 11733f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 11745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh * Returns the duration that the cell radio was up for data transfers. 11753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 11763f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public long getRadioDataUptime() { 11773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (mRadioDataStart == -1) { 11783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return mRadioDataUptime; 11793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 11803f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentRadioDataUptime() - mRadioDataStart; 11813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11843f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int getCurrentBluetoothPingCount() { 11853f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBtHeadset != null) { 11865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh List<BluetoothDevice> deviceList = mBtHeadset.getConnectedDevices(); 11875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh if (deviceList.size() > 0) { 11885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh return mBtHeadset.getBatteryUsageHint(deviceList.get(0)); 11893f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 11903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return -1; 11923f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11933f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 11943f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public int getBluetoothPingCount() { 11953f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBluetoothPingStart == -1) { 11963f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return mBluetoothPingCount; 11973f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } else if (mBtHeadset != null) { 11983f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentBluetoothPingCount() - mBluetoothPingStart; 11993f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 120082cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani return 0; 12013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 12023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 12033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public void setBtHeadset(BluetoothHeadset headset) { 120482cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) { 120582cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 120682cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani } 12073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBtHeadset = headset; 12083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 12093f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 12100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int mChangedBufferStates = 0; 12110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void addHistoryBufferLocked(long curTime) { 12130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mHaveBatteryLevel || !mRecordingHistory) { 12140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12171fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final long timeDiff = (mHistoryBaseTime+curTime) - mHistoryLastWritten.time; 12180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mHistoryBufferLastPos >= 0 && mHistoryLastWritten.cmd == HistoryItem.CMD_UPDATE 12191fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn && timeDiff < 2000 12200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn && ((mHistoryLastWritten.states^mHistoryCur.states)&mChangedBufferStates) == 0) { 12210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // If the current is the same as the one before, then we no 12220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // longer need the entry. 12230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataSize(mHistoryBufferLastPos); 12240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBufferLastPos); 12250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBufferLastPos = -1; 12260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mHistoryLastLastWritten.cmd == HistoryItem.CMD_UPDATE 12271fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn && timeDiff < 500 && mHistoryLastLastWritten.same(mHistoryCur)) { 12280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // If this results in us returning to the state written 12290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // prior to the last one, then we can just delete the last 12300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // written one and drop the new one. Nothing more to do. 12310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.setTo(mHistoryLastLastWritten); 12320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL; 12330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mChangedBufferStates |= mHistoryLastWritten.states^mHistoryCur.states; 12360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn curTime = mHistoryLastWritten.time - mHistoryBaseTime; 12371fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mHistoryLastWritten.setTo(mHistoryLastLastWritten); 12380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else { 12390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mChangedBufferStates = 0; 12400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final int dataSize = mHistoryBuffer.dataSize(); 12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (dataSize >= MAX_HISTORY_BUFFER) { 12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mHistoryOverflow) { 12450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryOverflow = true; 12460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(curTime, HistoryItem.CMD_OVERFLOW); 12470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Once we've reached the maximum number of items, we only 12500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // record changes to the battery level and the most interesting states. 12510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Once we've reached the maximum maximum number of items, we only 12520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // record changes to the battery level. 12530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mHistoryLastWritten.batteryLevel == mHistoryCur.batteryLevel && 12540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn (dataSize >= MAX_MAX_HISTORY_BUFFER 12550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn || ((mHistoryEnd.states^mHistoryCur.states) 12560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn & HistoryItem.MOST_INTERESTING_STATES) == 0)) { 12570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(curTime, HistoryItem.CMD_UPDATE); 12620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void addHistoryBufferLocked(long curTime, byte cmd) { 12650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int origPos = 0; 12660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mIteratingHistory) { 12670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn origPos = mHistoryBuffer.dataPosition(); 12680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); 12690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBufferLastPos = mHistoryBuffer.dataPosition(); 12710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastLastWritten.setTo(mHistoryLastWritten); 12720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur); 12730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.writeDelta(mHistoryBuffer, mHistoryLastLastWritten); 12740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mLastHistoryTime = curTime; 12750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "Writing history buffer: was " + mHistoryBufferLastPos 12760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " now " + mHistoryBuffer.dataPosition() 12770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " size is now " + mHistoryBuffer.dataSize()); 12780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mIteratingHistory) { 12790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(origPos); 12800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 12820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1283f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn int mChangedStates = 0; 1284f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 12856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(long curTime) { 12860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(curTime); 12870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 12886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mHaveBatteryLevel || !mRecordingHistory) { 12896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 12906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 12919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 12929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // If the current time is basically the same as the last time, 1293f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // and no states have since the last recorded entry changed and 1294f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // are now resetting back to their original value, then just collapse 1295f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // into one record. 12969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE 1297f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+2000) 1298f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn && ((mHistoryEnd.states^mHistoryCur.states)&mChangedStates) == 0) { 12999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // If the current is the same as the one before, then we no 13009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // longer need the entry. 13019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE 13021fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+500) 13039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && mHistoryLastEnd.same(mHistoryCur)) { 13049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd.next = null; 13059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd.next = mHistoryCache; 13069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCache = mHistoryEnd; 13079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd = mHistoryLastEnd; 13089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd = null; 13099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } else { 1310f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn mChangedStates |= mHistoryEnd.states^mHistoryCur.states; 13119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, mHistoryCur); 13129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return; 13149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1316f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn mChangedStates = 0; 1317f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 1318f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn if (mNumHistoryItems == MAX_HISTORY_ITEMS 1319f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) { 13207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn addHistoryRecordLocked(curTime, HistoryItem.CMD_OVERFLOW); 13217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 13227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 13236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mNumHistoryItems >= MAX_HISTORY_ITEMS) { 13246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // Once we've reached the maximum number of items, we only 1325f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // record changes to the battery level and the most interesting states. 1326f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // Once we've reached the maximum maximum number of items, we only 13276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // record changes to the battery level. 13286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryEnd != null && mHistoryEnd.batteryLevel 1329f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn == mHistoryCur.batteryLevel && 1330f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS 1331f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn || ((mHistoryEnd.states^mHistoryCur.states) 1332f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn & HistoryItem.MOST_INTERESTING_STATES) == 0)) { 13336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 13346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 13356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 13369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 13376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE); 13386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 13395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(long curTime, byte cmd) { 13416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem rec = mHistoryCache; 134232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec != null) { 134332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCache = rec.next; 134432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 13456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn rec = new HistoryItem(); 134632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur); 13485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(rec); 135032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(HistoryItem rec) { 13536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mNumHistoryItems++; 135432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec.next = null; 13559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd = mHistoryEnd; 135632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mHistoryEnd != null) { 135732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd.next = rec; 135832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd = rec; 135932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 136032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistory = mHistoryEnd = rec; 136132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 136232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void clearHistoryLocked() { 13650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "********** CLEARING HISTORY!"); 136632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mHistory != null) { 136732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd.next = mHistoryCache; 136832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCache = mHistory; 13699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistory = mHistoryLastEnd = mHistoryEnd = null; 137032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mNumHistoryItems = 0; 13726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryBaseTime = 0; 13730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mLastHistoryTime = 0; 13740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 13750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataSize(0); 13760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 13770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER/2); 13780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL; 13790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.cmd = HistoryItem.CMD_NULL; 13800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBufferLastPos = -1; 13810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryOverflow = false; 138232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 13835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 13846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void doUnplugLocked(long batteryUptime, long batteryRealtime) { 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 13871719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff u.mStartedTcpBytesReceived = TrafficStats.getUidRxBytes(u.mUid); 13881719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff u.mStartedTcpBytesSent = TrafficStats.getUidTxBytes(u.mUid); 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived; 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent; 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime); 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track total mobile data 13961719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mMobileDataRx, TrafficStats.getMobileRxBytes()); 13971719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mMobileDataTx, TrafficStats.getMobileTxBytes()); 13981719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mTotalDataRx, TrafficStats.getTotalRxBytes()); 13991719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mTotalDataTx, TrafficStats.getTotalTxBytes()); 14003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 14013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataStart = getCurrentRadioDataUptime(); 14023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = 0; 14033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 14043f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 14053f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = 0; 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 14086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void doPlugLocked(long batteryUptime, long batteryRealtime) { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesReceived >= 0) { 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived(); 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesReceived = -1; 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesSent >= 0) { 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent(); 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesSent = -1; 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).plug(batteryUptime, batteryRealtime); 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14231719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mMobileDataRx, TrafficStats.getMobileRxBytes()); 14241719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mMobileDataTx, TrafficStats.getMobileTxBytes()); 14251719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mTotalDataRx, TrafficStats.getTotalRxBytes()); 14261719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mTotalDataTx, TrafficStats.getTotalTxBytes()); 14273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 14283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataUptime = getRadioDataUptime(); 14293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 14303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 14313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 14323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = getBluetoothPingCount(); 14333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 14369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn int mWakeLockNesting; 14379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 14389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartWakeLocked(int uid, int pid, String name, int type) { 14391ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (type == WAKE_TYPE_PARTIAL) { 14401ebccf531d1049853b3b0630035434619682c016Dianne Hackborn // Only care about partial wake locks, since full wake locks 14411ebccf531d1049853b3b0630035434619682c016Dianne Hackborn // will be canceled when the user puts the screen to sleep. 14421ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWakeLockNesting == 0) { 14431ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG; 14441ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: " 14451ebccf531d1049853b3b0630035434619682c016Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 14461ebccf531d1049853b3b0630035434619682c016Dianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 14471ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 14481ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mWakeLockNesting++; 14499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (uid >= 0) { 14510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { 14520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); 14530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); 14540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type); 14569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 14599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopWakeLocked(int uid, int pid, String name, int type) { 14601ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (type == WAKE_TYPE_PARTIAL) { 14611ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mWakeLockNesting--; 14621ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWakeLockNesting == 0) { 14631ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG; 14641ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: " 14651ebccf531d1049853b3b0630035434619682c016Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 14661ebccf531d1049853b3b0630035434619682c016Dianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 14671ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 14689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (uid >= 0) { 14700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { 14710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); 14720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); 14730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type); 14759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 14787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) { 14797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 14807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 14817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteStartWakeLocked(ws.get(i), pid, name, type); 14827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 14837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 14847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 14857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) { 14867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 14877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 14887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteStopWakeLocked(ws.get(i), pid, name, type); 14897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 14907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 14917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 14920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public int startAddingCpuLocked() { 14930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.removeMessages(MSG_UPDATE_WAKELOCKS); 14940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 14950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (mScreenOn) { 14960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 14970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 14990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int N = mPartialTimers.size(); 15000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (N == 0) { 15010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.clear(); 15020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 15030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // How many timers should consume CPU? Only want to include ones 15060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // that have already been in the list. 15070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 15080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 15090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 15100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 15110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // We don't include the system UID, because it so often 15120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // holds wake locks at one request or another of an app. 15130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 15140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 50; 15150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 15200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void finishAddingCpuLocked(int perc, int utime, int stime, long[] cpuSpeedTimes) { 15230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int N = mPartialTimers.size(); 15240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (perc != 0) { 15250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn int num = 0; 15260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 15270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 15280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 15290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 15300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // We don't include the system UID, because it so often 15310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // holds wake locks at one request or another of an app. 15320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 15330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn num++; 15340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (num != 0) { 15380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 15390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 15400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 15410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 15420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 1543618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn int myUTime = utime/num; 1544618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn int mySTime = stime/num; 1545618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn utime -= myUTime; 1546618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn stime -= mySTime; 1547618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn num--; 15480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*"); 15490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addCpuTimeLocked(myUTime, mySTime); 15500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addSpeedStepTimes(cpuSpeedTimes); 15510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // Just in case, collect any lost CPU time. 15570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (utime != 0 || stime != 0) { 15580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = getUidStatsLocked(Process.SYSTEM_UID); 15590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null) { 15600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid.Proc proc = uid.getProcessStatsLocked("*lost*"); 15610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addCpuTimeLocked(utime, stime); 15620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addSpeedStepTimes(cpuSpeedTimes); 15630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int NL = mLastPartialTimers.size(); 15680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn boolean diff = N != NL; 15690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL && !diff; i++) { 15700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i); 15710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!diff) { 15730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL; i++) { 15740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPartialTimers.get(i).mInList = true; 15750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return; 15770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL; i++) { 15800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.get(i).mInList = false; 15810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.clear(); 15830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 15840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 15850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn st.mInList = true; 15860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.add(st); 15870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 15890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 15909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteProcessDiedLocked(int uid, int pid) { 15919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 15929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 15939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn u.mPids.remove(pid); 15949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 15979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public long getProcessWakeTime(int uid, int pid, long realtime) { 15989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 15999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 16009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid.Pid p = u.mPids.get(pid); 16019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p != null) { 16029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return p.mWakeSum + (p.mWakeStart != 0 ? (realtime - p.mWakeStart) : 0); 16039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return 0; 16069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) { 16099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 16109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 16119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn u.reportExcessiveWakeLocked(proc, overTime, usedTime); 16129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1615287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) { 1616287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Uid u = mUidStats.get(uid); 1617287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (u != null) { 1618287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn u.reportExcessiveCpuLocked(proc, overTime, usedTime); 1619287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1620287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1621287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 16229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn int mSensorNesting; 16239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartSensorLocked(int uid, int sensor) { 16259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mSensorNesting == 0) { 16269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG; 16279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: " 16289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mSensorNesting++; 16329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStartSensor(sensor); 16339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopSensorLocked(int uid, int sensor) { 16369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mSensorNesting--; 16379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mSensorNesting == 0) { 16389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG; 16399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: " 16409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStopSensor(sensor); 16449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 164632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mGpsNesting; 16475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 16486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteStartGpsLocked(int uid) { 164932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 16506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG; 165132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: " 165232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 165432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 165532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting++; 16562e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStartGps(); 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 16596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteStopGpsLocked(int uid) { 166032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting--; 166132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 16626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG; 166332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: " 166432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 166632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 16672e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStopGps(); 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOnLocked() { 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mScreenOn) { 16726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG; 167332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " 167432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = true; 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.startRunningLocked(this); 1678617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1679617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this); 1680617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 16819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // Fake a wake lock, so we consider the device waked as long 16839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // as the screen is on. 16841ebccf531d1049853b3b0630035434619682c016Dianne Hackborn noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); 1685c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 1686c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn // Update discharge amounts. 1687c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBatteryInternal) { 168832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateDischargeScreenLevelsLocked(false, true); 1689c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOffLocked() { 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mScreenOn) { 16956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG; 169632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: " 169732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.stopRunningLocked(this); 1701617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1702617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1703617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 17049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 17051ebccf531d1049853b3b0630035434619682c016Dianne Hackborn noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); 1706c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 1707c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn // Update discharge amounts. 1708c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBatteryInternal) { 170932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateDischargeScreenLevelsLocked(true, false); 1710c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 1711617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1712617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 17135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1714617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightnessLocked(int brightness) { 1715617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Bin the brightness. 1716617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS); 1717617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (bin < 0) bin = 0; 1718617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1; 1719617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin != bin) { 17206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK) 17216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT); 172232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: " 172332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 17246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1725617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenOn) { 1726617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1727617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1728617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1729617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[bin].startRunningLocked(this); 1730617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1731617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessBin = bin; 1732617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1733617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 17345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 17354cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void noteInputEventAtomic() { 17364cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mInputEventCounter.stepAtomic(); 1737617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 17385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1739617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int uid, int event) { 17402e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteUserActivityLocked(event); 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOnLocked() { 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPhoneOn) { 17453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG; 174632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: " 174732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 17486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = true; 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.startRunningLocked(this); 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOffLocked() { 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPhoneOn) { 17563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG; 175732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: " 175832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 17596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.stopRunningLocked(this); 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 176432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 17653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn void stopAllSignalStrengthTimersLocked(int except) { 17665284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 17673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (i == except) { 17683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn continue; 17693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 17703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) { 17713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mPhoneSignalStrengthsTimer[i].stopRunningLocked(this); 17723bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 17733bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 17743bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 17753bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 1776e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private int fixPhoneServiceState(int state, int signalBin) { 1777e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mPhoneSimStateRaw == TelephonyManager.SIM_STATE_ABSENT) { 1778e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // In this case we will always be STATE_OUT_OF_SERVICE, so need 1779e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // to infer that we are scanning from other data. 1780e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (state == ServiceState.STATE_OUT_OF_SERVICE 17815284090631e638b916d9a453212e9dc802656a67Wink Saville && signalBin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 1782e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn state = ServiceState.STATE_IN_SERVICE; 1783e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1784e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1785e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1786e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return state; 1787e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1788e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1789e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private void updateAllPhoneStateLocked(int state, int simState, int bin) { 17903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn boolean scanning = false; 1791e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean newHistory = false; 17923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 1793e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneServiceStateRaw = state; 1794e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSimStateRaw = simState; 1795e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthBinRaw = bin; 1796e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1797e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (simState == TelephonyManager.SIM_STATE_ABSENT) { 1798e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // In this case we will always be STATE_OUT_OF_SERVICE, so need 1799e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // to infer that we are scanning from other data. 1800e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (state == ServiceState.STATE_OUT_OF_SERVICE 18015284090631e638b916d9a453212e9dc802656a67Wink Saville && bin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 1802e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn state = ServiceState.STATE_IN_SERVICE; 1803e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1804e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 18053bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 18063bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If the phone is powered off, stop all timers. 18073bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (state == ServiceState.STATE_POWER_OFF) { 1808e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn bin = -1; 1809f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 1810e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // If we are in service, make sure the correct signal string timer is running. 1811e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (state == ServiceState.STATE_IN_SERVICE) { 1812e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // Bin will be changed below. 18133bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 18143bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If we're out of service, we are in the lowest signal strength 18153bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // bin and have the scanning bit set. 1816f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } else if (state == ServiceState.STATE_OUT_OF_SERVICE) { 18173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn scanning = true; 18185284090631e638b916d9a453212e9dc802656a67Wink Saville bin = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1819f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (!mPhoneSignalScanningTimer.isRunningLocked()) { 18206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG; 1821e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 18226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: " 18236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 1824f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.startRunningLocked(this); 1825f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1826f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 18275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 18283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (!scanning) { 18293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If we are no longer scanning, then stop the scanning timer. 18303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (mPhoneSignalScanningTimer.isRunningLocked()) { 18313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG; 18323bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: " 18333bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 1834e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 18353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mPhoneSignalScanningTimer.stopRunningLocked(this); 18363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 18373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 18383bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 183932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mPhoneServiceState != state) { 18406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK) 18416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (state << HistoryItem.STATE_PHONE_STATE_SHIFT); 1842e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + state + " to: " 184332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 1844e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 184532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mPhoneServiceState = state; 184632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 1847e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1848e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mPhoneSignalStrengthBin != bin) { 1849e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mPhoneSignalStrengthBin >= 0) { 1850e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this); 1851e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1852e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (bin >= 0) { 1853e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) { 1854e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 1855e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1856e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_SIGNAL_STRENGTH_MASK) 1857e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn | (bin << HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT); 1858e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: " 1859e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 1860e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 1861e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 1862e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn stopAllSignalStrengthTimersLocked(-1); 1863e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1864e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthBin = bin; 1865e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1866e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1867e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (newHistory) { 1868e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1869e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1870e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1871e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1872e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn /** 1873e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * Telephony stack updates the phone state. 1874e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * @param state phone state from ServiceState.getState() 1875e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn */ 1876e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn public void notePhoneStateLocked(int state, int simState) { 1877e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn updateAllPhoneStateLocked(state, simState, mPhoneSignalStrengthBinRaw); 187832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 187932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 1880e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) { 1881627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Bin the strength. 18825284090631e638b916d9a453212e9dc802656a67Wink Saville int bin = signalStrength.getLevel(); 1883e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn updateAllPhoneStateLocked(mPhoneServiceStateRaw, mPhoneSimStateRaw, bin); 1884627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 18855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1886627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) { 1887627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin = DATA_CONNECTION_NONE; 1888627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (hasData) { 1889627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn switch (dataType) { 1890627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_EDGE: 1891627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_EDGE; 1892627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1893627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_GPRS: 1894627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_GPRS; 1895627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1896627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_UMTS: 1897627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_UMTS; 1898627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 18996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_CDMA: 19006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_CDMA; 19016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_0: 19036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_0; 19046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_A: 19066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_A; 19076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_1xRTT: 19096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_1xRTT; 19106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSDPA: 19126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSDPA; 19136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSUPA: 19156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSUPA; 19166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSPA: 19186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSPA; 19196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_IDEN: 19216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_IDEN; 19226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 19236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_B: 19246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_B; 19256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 1926962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt case TelephonyManager.NETWORK_TYPE_LTE: 1927962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt bin = DATA_CONNECTION_LTE; 1928962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt break; 1929962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt case TelephonyManager.NETWORK_TYPE_EHRPD: 1930962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt bin = DATA_CONNECTION_EHRPD; 1931962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt break; 1932627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn default: 1933627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_OTHER; 1934627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1935627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1936627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 19373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData); 1938627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType != bin) { 19396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK) 19406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT); 194132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: " 194232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1944627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType >= 0) { 1945627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this); 1946627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1947627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionType = bin; 1948627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[bin].startRunningLocked(this); 1949627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1950627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 19515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 195258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOnLocked() { 1953105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mWifiOn) { 19546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG; 195532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: " 195632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1958105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = true; 1959105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.startRunningLocked(this); 1960105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1961105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 19625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 196358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOffLocked() { 1964105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mWifiOn) { 19656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG; 196632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: " 196732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1969105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 1970105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.stopRunningLocked(this); 1971105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1972617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 197358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked(); 1974617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = -1; 1975617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1976105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1977244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1978244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOnLocked(int uid) { 1979244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioOn) { 19806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG; 198132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: " 198232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1984244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = true; 1985244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.startRunningLocked(this); 1986244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 19872e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOnLocked(); 1988244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 19895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1990244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOffLocked(int uid) { 1991244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioOn) { 19926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; 199332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " 199432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1996244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = false; 1997244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.stopRunningLocked(this); 1998244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 19992e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOffLocked(); 2000244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2001244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2002244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOnLocked(int uid) { 2003244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoOn) { 20046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG; 200532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: " 200632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2008244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = true; 2009244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.startRunningLocked(this); 2010244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 20112e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOnLocked(); 2012244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 20135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2014244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOffLocked(int uid) { 2015244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoOn) { 20166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG; 201732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " 201832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2020244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = false; 2021244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.stopRunningLocked(this); 2022244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 20232e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOffLocked(); 2024244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2025244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 202658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningLocked(WorkSource ws) { 202758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (!mGlobalWifiRunning) { 20286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG; 202932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: " 203032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 203258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = true; 203358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.startRunningLocked(this); 203458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = ws.size(); 203558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 203658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(ws.get(i)).noteWifiRunningLocked(); 203758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 203858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 203958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running"); 2040d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2041d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2042d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 204358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) { 204458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mGlobalWifiRunning) { 204558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = oldWs.size(); 204658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 204758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked(); 204858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 204958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn N = newWs.size(); 205058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 205158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked(); 205258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 205358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 205458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running"); 205558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 205658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 205758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 205858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStoppedLocked(WorkSource ws) { 205958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mGlobalWifiRunning) { 20606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RUNNING_FLAG; 206132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: " 206232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 206458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 206558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.stopRunningLocked(this); 206658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = ws.size(); 206758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 206858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked(); 206958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 207058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 207158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running"); 2072d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2073d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2074d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 2075105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOnLocked() { 2076105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mBluetoothOn) { 20776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG; 207832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: " 207932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2081105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = true; 2082105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.startRunningLocked(this); 2083105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2084105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 20855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2086105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOffLocked() { 2087105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mBluetoothOn) { 20886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG; 208932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: " 209032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2092105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 2093105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.stopRunningLocked(this); 2094105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2095105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 20965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 209732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiFullLockNesting = 0; 20985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2099105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked(int uid) { 210032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 21016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; 210232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: " 210332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 210532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 210632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting++; 21072e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked(); 2108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2109105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2110105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked(int uid) { 211132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting--; 211232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 21136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; 211432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: " 211532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 211732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 21182e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockReleasedLocked(); 2119105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2120105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 212132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiScanLockNesting = 0; 21225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2123105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked(int uid) { 212432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiScanLockNesting == 0) { 21256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG; 212632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: " 212732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 212932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 213032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiScanLockNesting++; 21312e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked(); 2132105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2133105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2134105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked(int uid) { 213532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiScanLockNesting--; 213632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiScanLockNesting == 0) { 21376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG; 213832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: " 213932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 214132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 21422e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockReleasedLocked(); 2143105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 21445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 214532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiMulticastNesting = 0; 21465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 21475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked(int uid) { 214832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 21496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; 215032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: " 215132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 215332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 215432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting++; 21552e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastEnabledLocked(); 21565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 21575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 21585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked(int uid) { 215932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting--; 216032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 21616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; 216232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: " 216332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 216532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 21662e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastDisabledLocked(); 21675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 21685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 21697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) { 21707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 21727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteFullWifiLockAcquiredLocked(ws.get(i)); 21737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 21767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) { 21777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 21797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteFullWifiLockReleasedLocked(ws.get(i)); 21807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 21837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteScanWifiLockAcquiredFromSourceLocked(WorkSource ws) { 21847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 21867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteScanWifiLockAcquiredLocked(ws.get(i)); 21877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 21907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteScanWifiLockReleasedFromSourceLocked(WorkSource ws) { 21917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 21937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteScanWifiLockReleasedLocked(ws.get(i)); 21947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 21977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) { 21987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 21997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 22007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteWifiMulticastEnabledLocked(ws.get(i)); 22017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 22047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) { 22057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 22067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 22077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteWifiMulticastDisabledLocked(ws.get(i)); 22087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getScreenOnTime(long batteryRealtime, int which) { 2212c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which); 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2215617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public long getScreenBrightnessTime(int brightnessBin, 2216617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long batteryRealtime, int which) { 2217c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked( 2218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn batteryRealtime, which); 2219617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2220244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getInputEventCount(int which) { 2222c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mInputEventCounter.getCountLocked(which); 2223617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 22245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getPhoneOnTime(long batteryRealtime, int which) { 2226c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which); 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2228244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2229627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneSignalStrengthTime(int strengthBin, 2230627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 2231c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked( 2232627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 2233627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2234f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 2235f37447bad3773b62176baa837908daf6edb44273Amith Yamasani @Override public long getPhoneSignalScanningTime( 2236f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long batteryRealtime, int which) { 2237f37447bad3773b62176baa837908daf6edb44273Amith Yamasani return mPhoneSignalScanningTimer.getTotalTimeLocked( 2238f37447bad3773b62176baa837908daf6edb44273Amith Yamasani batteryRealtime, which); 2239f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 2240f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 2241617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneSignalStrengthCount(int dataType, int which) { 2242c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 2243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 22445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2245627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneDataConnectionTime(int dataType, 2246627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 2247c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked( 2248627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 2249627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 22505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2251617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneDataConnectionCount(int dataType, int which) { 2252c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 2253617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 22545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getWifiOnTime(long batteryRealtime, int which) { 2256c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which); 2257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 22585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 225958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) { 226058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 2261d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2262d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 2263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getBluetoothOnTime(long batteryRealtime, int which) { 2264c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which); 2265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 22665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean getIsOnBattery() { 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() { 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUidStats; 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular uid. 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Uid extends BatteryStats.Uid { 22795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mUid; 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesReceived; 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesSent; 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesReceived; 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesSent; 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesReceivedAtLastUnplug; 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesSentAtLastUnplug; 22875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are not saved/restored when parcelling, since we want 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to return from the parcel with a snapshot of the state. 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesReceived = -1; 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesSent = -1; 22925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 229358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn boolean mWifiRunning; 229458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn StopwatchTimer mWifiRunningTimer; 22955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2296105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mFullWifiLockOut; 2297c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mFullWifiLockTimer; 22985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2299105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mScanWifiLockOut; 2300c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScanWifiLockTimer; 23015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt boolean mWifiMulticastEnabled; 23035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt StopwatchTimer mWifiMulticastTimer; 23045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2305244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioTurnedOn; 2306244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioTurnedOnTimer; 23075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2308244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoTurnedOn; 2309244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoTurnedOnTimer; 23105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2311617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter[] mUserActivityCounters; 23125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's wake locks. 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>(); 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's sensor activations. 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>(); 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>(); 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>(); 23325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn /** 23349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn * The transient wake stats we have collected for this uid's pids. 23359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn */ 23369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn final SparseArray<Pid> mPids = new SparseArray<Pid>(); 23379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid(int uid) { 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUid = uid; 234058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 234158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables); 23420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 234358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables); 23440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK, 234558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers, mUnpluggables); 23460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 234758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables); 23480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 23490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables); 23500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 23515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt null, mUnpluggables); 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() { 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWakelockStats; 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() { 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSensorStats; 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() { 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProcessStats; 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() { 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageStats; 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2373eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2374eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getUid() { 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUid; 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2378eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2379eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesReceived(int which) { 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesReceived; 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesReceived(); 23856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesReceivedAtLastUnplug; 23876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesReceived; 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesReceived() { 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0 23961719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff ? (TrafficStats.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0); 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2398eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2399eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesSent(int which) { 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesSent; 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesSent(); 24056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesSentAtLastUnplug; 24076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesSent; 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2414105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 241558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningLocked() { 241658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (!mWifiRunning) { 241758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = true; 241858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer == null) { 241958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 242058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables); 24216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 242258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this); 2423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2424617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 24255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 242758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStoppedLocked() { 242858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunning) { 242958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = false; 243058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this); 2431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2432617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 24335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2434617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2435105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked() { 2436105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mFullWifiLockOut) { 2437105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = true; 24386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer == null) { 24390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 244058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables); 24416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2442105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 2443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2444105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2446105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked() { 2448105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mFullWifiLockOut) { 2449105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 2450105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 2451105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2452105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2454105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2455105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked() { 2456105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mScanWifiLockOut) { 2457105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = true; 24586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer == null) { 24590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK, 246058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers, mUnpluggables); 24616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2462105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 2463105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2464105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2466105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2467105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked() { 2468105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mScanWifiLockOut) { 2469105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 2470105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 2471105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2472105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 24755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked() { 24765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (!mWifiMulticastEnabled) { 24775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = true; 24786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer == null) { 24790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 248058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables); 24816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this); 24835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 24875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked() { 24885347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (mWifiMulticastEnabled) { 24895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 24905347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this); 24915347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24925347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24935347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 24956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteAudioTurnedOnLocked() { 24966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mAudioTurnedOn) { 24976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = true; 24986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer == null) { 24990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 25006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables); 25016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 25036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2504617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2505244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 25066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 25076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteAudioTurnedOffLocked() { 25086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOn) { 25096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = false; 25106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 25116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 25156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteVideoTurnedOnLocked() { 25166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mVideoTurnedOn) { 25176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = true; 25186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer == null) { 25190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 25206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables); 25216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 25236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 25276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteVideoTurnedOffLocked() { 25286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOn) { 25296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = false; 25306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 25316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2532244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2533244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 25345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 253558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public long getWifiRunningTime(long batteryRealtime, int which) { 253658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer == null) { 25376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 253958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 2540244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2541244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 25425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 2543105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getFullWifiLockTime(long batteryRealtime, int which) { 25446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer == null) { 25456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 2548105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 25495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 25505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 2551105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getScanWifiLockTime(long batteryRealtime, int which) { 25526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer == null) { 25536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 2556105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 25575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 25585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 25595347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public long getWifiMulticastTime(long batteryRealtime, int which) { 25606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer == null) { 25616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime, 25645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt which); 25655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 25665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 25675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 25686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public long getAudioTurnedOnTime(long batteryRealtime, int which) { 25696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer == null) { 25706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 25736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 25766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public long getVideoTurnedOnTime(long batteryRealtime, int which) { 25776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer == null) { 25786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 25796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 25816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 2583617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2584617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int type) { 2585617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 2586617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn initUserActivityLocked(); 2587617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2588617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (type < 0) type = 0; 2589617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1; 25904cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUserActivityCounters[type].stepAtomic(); 2591617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 25925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2593617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public boolean hasUserActivity() { 2595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return mUserActivityCounters != null; 2596617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 25975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2598617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2599617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public int getUserActivityCount(int type, int which) { 2600617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 2601617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return 0; 2602617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2603c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUserActivityCounters[type].getCountLocked(which); 2604617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 26055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2606617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void initUserActivityLocked() { 2607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 2608617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables); 2610617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2611617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 26125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesSent() { 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0 26151719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff ? (TrafficStats.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0); 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2617244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 26186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 26196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear all stats for this uid. Returns true if the uid is completely 26206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * inactive so can be dropped. 26216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 26226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 26236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean active = false; 26245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 262558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 262658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false); 262758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn active |= mWifiRunning; 26286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 26309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false); 26316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mFullWifiLockOut; 26326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer != null) { 26349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mScanWifiLockTimer.reset(BatteryStatsImpl.this, false); 26356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mScanWifiLockOut; 26366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 26389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false); 26396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mWifiMulticastEnabled; 26406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 26429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false); 26436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mAudioTurnedOn; 26446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 26469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false); 26476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mVideoTurnedOn; 26486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 26506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0; 26516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0; 26525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 26536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 26546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 26556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters[i].reset(false); 26566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 26596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWakelockStats.size() > 0) { 26606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator(); 26616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 26626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Wakelock> wakelockEntry = it.next(); 26636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Wakelock wl = wakelockEntry.getValue(); 26646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (wl.reset()) { 26656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn it.remove(); 26666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 26676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active = true; 26686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mSensorStats.size() > 0) { 26726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator(); 26736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 26746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<Integer, Sensor> sensorEntry = it.next(); 26756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Sensor s = sensorEntry.getValue(); 26766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (s.reset()) { 26776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn it.remove(); 26786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 26796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active = true; 26806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mProcessStats.size() > 0) { 26846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator(); 26856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 26866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Proc> procEntry = it.next(); 26876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn procEntry.getValue().detach(); 26886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mProcessStats.clear(); 26906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mPids.size() > 0) { 26929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; !active && i<mPids.size(); i++) { 26939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid pid = mPids.valueAt(i); 26949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (pid.mWakeStart != 0) { 26959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active = true; 26969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 26979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 26989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 26996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mPackageStats.size() > 0) { 27006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator(); 27016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 27026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Pkg> pkgEntry = it.next(); 27036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Pkg p = pkgEntry.getValue(); 27046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn p.detach(); 27056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (p.mServiceStats.size() > 0) { 27066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Pkg.Serv>> it2 27076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn = p.mServiceStats.entrySet().iterator(); 27086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it2.hasNext()) { 27096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Pkg.Serv> servEntry = it2.next(); 27106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn servEntry.getValue().detach(); 27116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mPackageStats.clear(); 27156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27165a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 27179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPids.clear(); 27189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 27196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!active) { 272058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 272158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.detach(); 27226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 27246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer.detach(); 27256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer != null) { 27276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mScanWifiLockTimer.detach(); 27286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 27306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer.detach(); 27316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 27336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.detach(); 27346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 27366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.detach(); 27376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 27396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 27406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters[i].detach(); 27416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 27456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return !active; 27466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakelockStats.size()); 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) { 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(wakelockEntry.getKey()); 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = wakelockEntry.getValue(); 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.writeToParcelLocked(out, batteryRealtime); 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mSensorStats.size()); 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) { 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(sensorEntry.getKey()); 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = sensorEntry.getValue(); 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.writeToParcelLocked(out, batteryRealtime); 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mProcessStats.size()); 27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) { 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(procEntry.getKey()); 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = procEntry.getValue(); 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.writeToParcelLocked(out); 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mPackageStats.size()); 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) { 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(pkgEntry.getKey()); 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = pkgEntry.getValue(); 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.writeToParcelLocked(out); 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesReceived); 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesSent); 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesReceived()); 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesSent()); 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesReceivedAtLastUnplug); 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesSentAtLastUnplug); 278358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 27846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 278558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.writeToParcel(out, batteryRealtime); 27866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 2787617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 27886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 27906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 27916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer.writeToParcel(out, batteryRealtime); 2792617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 27936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 27946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer != null) { 27966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 27976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mScanWifiLockTimer.writeToParcel(out, batteryRealtime); 27986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 27996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 28006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 28026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 28036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer.writeToParcel(out, batteryRealtime); 28046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 28066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 28086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 28096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime); 28106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 28126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 28146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 28156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime); 28166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 28186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 2820617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 2821617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2822617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i].writeToParcel(out); 2823617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 28246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 2826617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numWakelocks = in.readInt(); 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.clear(); 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < numWakelocks; j++) { 28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wakelockName = in.readString(); 28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = new Wakelock(); 28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.readFromParcelLocked(unpluggables, in); 28369e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) { 28379e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // We will just drop some random set of wakelocks if 28389e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // the previous run of the system was an older version 28399e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // that didn't impose a limit. 28409e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn mWakelockStats.put(wakelockName, wakelock); 28419e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numSensors = in.readInt(); 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.clear(); 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numSensors; k++) { 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = in.readInt(); 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = new Sensor(sensorNumber); 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.readFromParcelLocked(mUnpluggables, in); 28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensorNumber, sensor); 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numProcs = in.readInt(); 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.clear(); 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numProcs; k++) { 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String processName = in.readString(); 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = new Proc(); 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.readFromParcelLocked(in); 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(processName, proc); 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numPkgs = in.readInt(); 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.clear(); 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int l = 0; l < numPkgs; l++) { 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = in.readString(); 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = new Pkg(); 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.readFromParcelLocked(in); 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(packageName, pkg); 28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesReceived = in.readLong(); 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesSent = in.readLong(); 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesReceived = in.readLong(); 28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesSent = in.readLong(); 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesReceivedAtLastUnplug = in.readLong(); 28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesSentAtLastUnplug = in.readLong(); 287758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = false; 28786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 287958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 288058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables, in); 28816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 288258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = null; 28836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2884105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 28856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 28860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 288758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables, in); 28886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer = null; 28906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2891105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 28926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 28930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK, 289458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers, mUnpluggables, in); 28956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 28966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mScanWifiLockTimer = null; 28976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 28996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 29000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 290158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables, in); 2902617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 29036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer = null; 29046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = false; 29066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 29070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 29086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables, in); 29096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 29106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer = null; 29116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = false; 29136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 29140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 29156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables, in); 29166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 29176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer = null; 29186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 2920617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 2921617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2922617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables, in); 2923617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 29246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 29256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters = null; 2926617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular wake lock. 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Wakelock extends BatteryStats.Uid.Wakelock { 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device partially awake. 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2936c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerPartial; 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device fully awake. 29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2941c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerFull; 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has had a window keeping the device awake. 29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2946c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerWindow; 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a possibly null Timer from a Parcel. The timer is associated with the 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proper timer pool from the given BatteryStatsImpl object. 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in the Parcel to be read from. 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return a new Timer, or null. 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2955c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool, 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<Unpluggable> unpluggables, Parcel in) { 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return new StopwatchTimer(Uid.this, type, pool, unpluggables, in); 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 29656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean wlactive = false; 29666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerFull != null) { 29679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false); 29686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPartial != null) { 29709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false); 29716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerWindow != null) { 29739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false); 29746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!wlactive) { 29766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerFull != null) { 29776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerFull.detach(); 29786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerFull = null; 29796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPartial != null) { 29816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPartial.detach(); 29826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPartial = null; 29836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerWindow != null) { 29856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerWindow.detach(); 29866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerWindow = null; 29876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return !wlactive; 29906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers, unpluggables, in); 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers, unpluggables, in); 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers, unpluggables, in); 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime); 30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime); 30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime); 30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getWakeTime(int type) { 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: return mTimerFull; 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: return mTimerPartial; 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: return mTimerWindow; 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: throw new IllegalArgumentException("type = " + type); 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Sensor extends BatteryStats.Uid.Sensor { 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mHandle; 3020c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimer; 30215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Sensor(int handle) { 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandle = handle; 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3026c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables, 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in) { 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3032c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle); 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool == null) { 3034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pool = new ArrayList<StopwatchTimer>(); 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(mHandle, pool); 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in); 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 30419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mTimer.reset(BatteryStatsImpl.this, true)) { 30426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimer = null; 30436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 30446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return false; 30466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimer = readTimerFromParcel(unpluggables, in); 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimer, batteryRealtime); 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getSensorTime() { 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTimer; 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3060eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3061eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHandle() { 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHandle; 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable { 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in user code. 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUserTime; 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in kernel code. 30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSystemTime; 30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times the process has been started. 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3087eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Amount of time the process was running in the foreground. 3088eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3089eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mForegroundTime; 3090eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3091eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from a previous save. 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedUserTime; 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from a previous save. 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedSystemTime; 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from a previous save. 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3107eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from a previous save. 3108eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3109eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLoadedForegroundTime; 3110eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3111eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from the previous run. 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUserTime; 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from the previous run. 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastSystemTime; 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from the previous run. 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3127eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from the previous run 3128eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3129eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLastForegroundTime; 3130eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3131eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time when last unplugged. 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedUserTime; 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time when last unplugged. 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedSystemTime; 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started before unplugged. 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3146eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 3147eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time since unplugged. 3148eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3149eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mUnpluggedForegroundTime; 3150eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3151e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter[] mSpeedBins; 3152e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3153287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ArrayList<ExcessivePower> mExcessivePower; 31549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc() { 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 3157e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mSpeedBins = new SamplingCounter[getCpuSpeedSteps()]; 31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = mUserTime; 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = mSystemTime; 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 3164eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = mForegroundTime; 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 31706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 31716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 31726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i = 0; i < mSpeedBins.length; i++) { 31736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 31746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c != null) { 31756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(c); 31766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = null; 31776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3181287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int countExcessivePowers() { 3182287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mExcessivePower != null ? mExcessivePower.size() : 0; 31839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 31849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3185287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public ExcessivePower getExcessivePower(int i) { 3186287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower != null) { 3187287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mExcessivePower.get(i); 31889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 31899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return null; 31909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 31919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 31929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void addExcessiveWake(long overTime, long usedTime) { 3193287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 3194287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 31959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 3196287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3197287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = ExcessivePower.TYPE_WAKE; 31989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.overTime = overTime; 31999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.usedTime = usedTime; 3200287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 32019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3203287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void addExcessiveCpu(long overTime, long usedTime) { 3204287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 3205287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 3206287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3207287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3208287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = ExcessivePower.TYPE_CPU; 3209287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.overTime = overTime; 3210287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.usedTime = usedTime; 3211287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 3212287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3213287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 3214287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void writeExcessivePowerToParcelLocked(Parcel out) { 3215287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 32169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeInt(0); 32179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return; 32189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3220287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final int N = mExcessivePower.size(); 32219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeInt(N); 32229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; i<N; i++) { 3223287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = mExcessivePower.get(i); 3224287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn out.writeInt(ew.type); 32259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeLong(ew.overTime); 32269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeLong(ew.usedTime); 32279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 32307b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn boolean readExcessivePowerFromParcelLocked(Parcel in) { 32319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn final int N = in.readInt(); 32329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (N == 0) { 3233287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = null; 32347b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return true; 32359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 32377b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (N > 10000) { 32387b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn Slog.w(TAG, "File corrupt: too many excessive power entries " + N); 32397b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return false; 32407b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 32417b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn 3242287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 32439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; i<N; i++) { 3244287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3245287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = in.readInt(); 32469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.overTime = in.readLong(); 32479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.usedTime = in.readLong(); 3248287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 32499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32507b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return true; 32519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 32529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUserTime); 32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mSystemTime); 3256eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mForegroundTime); 32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedUserTime); 32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedSystemTime); 3260eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mLoadedForegroundTime); 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedUserTime); 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedSystemTime); 3264eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mUnpluggedForegroundTime); 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 3266e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3267e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(mSpeedBins.length); 3268e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length; i++) { 32696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 32706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c != null) { 32716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 32726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn c.writeToParcel(out); 32736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 32746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 32756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3276e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 32779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3278287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn writeExcessivePowerToParcelLocked(out); 32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime = in.readLong(); 32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime = in.readLong(); 3284eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime = in.readLong(); 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedUserTime = in.readLong(); 32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedSystemTime = in.readLong(); 3288eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mLoadedForegroundTime = in.readLong(); 32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 32903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastUserTime = 0; 32913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastSystemTime = 0; 32923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastForegroundTime = 0; 32933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStarts = 0; 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = in.readLong(); 32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = in.readLong(); 3296eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = in.readLong(); 32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 3298e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3299e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani int bins = in.readInt(); 33006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int steps = getCpuSpeedSteps(); 33016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps]; 3302e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < bins; i++) { 33036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 33046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = new SamplingCounter(mUnpluggables, in); 33056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3306e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 33079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3308287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn readExcessivePowerFromParcelLocked(in); 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCpuTimeLocked(int utime, int stime) { 33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime += utime; 33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime += stime; 33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3320eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public void addForegroundTimeLocked(long ttime) { 3321eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime += ttime; 3322eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3323eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incStartsLocked() { 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getUserTime(int which) { 33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastUserTime; 33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mUserTime; 33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedUserTime; 33376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedUserTime; 33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSystemTime(int which) { 33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastSystemTime; 33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mSystemTime; 33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedSystemTime; 33536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedSystemTime; 33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3361eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public long getForegroundTime(int which) { 3362eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long val; 3363eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_LAST) { 3364eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mLastForegroundTime; 3365eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } else { 3366eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mForegroundTime; 3367eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_CURRENT) { 3368eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mLoadedForegroundTime; 33696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 3370eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mUnpluggedForegroundTime; 3371eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3372eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3373eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani return val; 3374eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3375eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3376eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 33856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3391e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3392e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /* Called by ActivityManagerService when CPU times are updated. */ 3393e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void addSpeedStepTimes(long[] values) { 3394e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length && i < values.length; i++) { 33956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long amt = values[i]; 33966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (amt != 0) { 33976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 33986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c == null) { 33996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = c = new SamplingCounter(mUnpluggables); 34006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 34016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn c.addCountAtomic(values[i]); 34026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3403e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3404e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3405e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3406e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 3407e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public long getTimeAtCpuSpeedStep(int speedStep, int which) { 3408e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (speedStep < mSpeedBins.length) { 34096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[speedStep]; 34106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return c != null ? c.getCountLocked(which) : 0; 3411e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } else { 3412e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return 0; 3413e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3414e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable { 34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times this package has done something that could wake up the 34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mWakeups; 34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device loaded from a 34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous save. 34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedWakeups; 34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastWakeups; 34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedWakeups; 34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statics we have collected for this package's services. 34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>(); 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg() { 34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = mWakeups; 34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 34616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 34626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 34636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 34645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups = in.readInt(); 34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedWakeups = in.readInt(); 34683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastWakeups = 0; 34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = in.readInt(); 34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numServs = in.readInt(); 34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.clear(); 34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int m = 0; m < numServs; m++) { 34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String serviceName = in.readString(); 34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = new Serv(); 34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.put(serviceName, serv); 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.readFromParcelLocked(in); 34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakeups); 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedWakeups); 34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedWakeups); 34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mServiceStats.size()); 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) { 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(servEntry.getKey()); 34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = servEntry.getValue(); 34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.writeToParcelLocked(out); 34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() { 34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServiceStats; 34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWakeups(int which) { 35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastWakeups; 35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mWakeups; 35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedWakeups; 35106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedWakeups; 35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable { 35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left started. 35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartTime; 35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been started and not yet stopped, this is 35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started. 35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRunningSince; 35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently running. 35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning; 35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number of times startService() has been called. 35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left launched. 35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedTime; 35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been launched and not yet exited, this is 35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was launched (ms in battery uptime). 35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedSince; 35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently launched. 35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLaunched; 35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number times the service has been launched. 35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLaunches; 35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started loaded from a previous save 35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (ms in battery uptime). 35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedStartTime; 35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts loaded from a previous save. 35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches loaded from a previous save. 35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedLaunches; 35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started as of the last run (ms 35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastStartTime; 35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts as of the last run. 35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches as of the last run. 35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastLaunches; 35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started when last unplugged (ms 35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedStartTime; 36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts when last unplugged. 36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches when last unplugged. 36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedLaunches; 36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Serv() { 36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime); 36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = mLaunches; 36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 36256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 36266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 36276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 36285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime = in.readLong(); 36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = in.readLong(); 36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = in.readInt() != 0; 36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime = in.readLong(); 36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = in.readLong(); 36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = in.readInt() != 0; 36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches = in.readInt(); 36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStartTime = in.readLong(); 36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedLaunches = in.readInt(); 36413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStartTime = 0; 36423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStarts = 0; 36433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastLaunches = 0; 36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = in.readLong(); 36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = in.readInt(); 36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mStartTime); 36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRunningSince); 36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mRunning ? 1 : 0); 36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedTime); 36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedSince); 36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunched ? 1 : 0); 36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunches); 36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedStartTime); 36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedLaunches); 36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedStartTime); 36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedLaunches); 36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getLaunchTimeToNowLocked(long batteryUptime) { 36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) return mLaunchedTime; 36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLaunchedTime + batteryUptime - mLaunchedSince; 36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getStartTimeToNowLocked(long batteryUptime) { 36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) return mStartTime; 36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartTime + batteryUptime - mRunningSince; 36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLaunchedLocked() { 36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) { 36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches++; 36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = getBatteryUptimeLocked(); 36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = true; 36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopLaunchedLocked() { 36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLaunched) { 36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mLaunchedSince; 36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime += time; 36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches--; 36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = false; 36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startRunningLocked() { 36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) { 36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = getBatteryUptimeLocked(); 37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopRunningLocked() { 37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRunning) { 37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mRunningSince; 37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime += time; 37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts--; 37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = false; 37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLaunches(int which) { 37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastLaunches; 37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLaunches; 37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedLaunches; 37306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedLaunches; 37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getStartTime(long now, int which) { 37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStartTime; 37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = getStartTimeToNowLocked(now); 37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStartTime; 37476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStartTime; 37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 37646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incWakeupsLocked() { 37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups++; 37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Serv newServiceStatsLocked() { 37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Serv(); 37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Proc getProcessStatsLocked(String name) { 37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc ps = mProcessStats.get(name); 37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Proc(); 37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(name, ps); 37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3800b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public SparseArray<? extends Pid> getPidStats() { 3801b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn return mPids; 3802b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 38035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 38049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public Pid getPidStatsLocked(int pid) { 38059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = mPids.get(pid); 38069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p == null) { 38079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p = new Pid(); 38089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPids.put(pid, p); 38099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 38109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return p; 38119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 38129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg getPackageStatsLocked(String name) { 38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = mPackageStats.get(name); 38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Pkg(); 38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(name, ps); 38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg.Serv getServiceStatsLocked(String pkg, String serv) { 38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = getPackageStatsLocked(pkg); 38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg.Serv ss = ps.mServiceStats.get(serv); 38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ss == null) { 38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss = ps.newServiceStatsLocked(); 38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps.mServiceStats.put(serv, ss); 38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getWakeTimerLocked(String name, int type) { 38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Wakelock wl = mWakelockStats.get(name); 38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl == null) { 38459e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) { 38469e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn name = BATCHED_WAKELOCK_NAME; 38479e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = mWakelockStats.get(name); 38489e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 38499e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (wl == null) { 38509e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = new Wakelock(); 38519e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn mWakelockStats.put(name, wl); 38529e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = null; 38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: 38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerPartial; 38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 38590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL, 38600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPartialTimers, mUnpluggables); 38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial = t; 38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: 38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerFull; 38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 38670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL, 38680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullTimers, mUnpluggables); 38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull = t; 38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: 38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerWindow; 38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 38750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW, 38760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWindowTimers, mUnpluggables); 38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow = t; 38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("type=" + type); 38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) { 38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sensor se = mSensorStats.get(sensor); 38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se == null) { 38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!create) { 38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se = new Sensor(sensor); 38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensor, se); 38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = se.mTimer; 38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3898c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor); 38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timers == null) { 3900c64edde69d18498fb2954f71a546357b07ab996aEvan Millar timers = new ArrayList<StopwatchTimer>(); 39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(sensor, timers); 39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables); 39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer = t; 39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartWakeLocked(int pid, String name, int type) { 3909c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39131ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { 39149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = getPidStatsLocked(pid); 3915b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn if (p.mWakeStart == 0) { 3916b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn p.mWakeStart = SystemClock.elapsedRealtime(); 3917b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn } 39189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopWakeLocked(int pid, String name, int type) { 3922c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39261ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { 39279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = mPids.get(pid); 3928b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn if (p != null && p.mWakeStart != 0) { 39299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart; 39309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.mWakeStart = 0; 39319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 39359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) { 39369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Proc p = getProcessStatsLocked(proc); 39379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p != null) { 39389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.addExcessiveWake(overTime, usedTime); 39399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3942287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) { 3943287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Proc p = getProcessStatsLocked(proc); 3944287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (p != null) { 3945287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn p.addExcessiveCpu(overTime, usedTime); 3946287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3947287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3948287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int sensor) { 3950c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, true); 39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 39535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh } 39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int sensor) { 39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't create a timer if one doesn't already exist 3958c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, false); 39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 39615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh } 39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps() { 3965c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true); 39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 39685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh } 39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps() { 3972c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false); 39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 3975244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(String filename) { 39841afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = new JournaledFile(new File(filename), new File(filename + ".tmp")); 39850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = new MyHandler(); 39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 39870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables); 3988617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 39890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables); 3990617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3991617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables); 39920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables); 39935284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 39940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables); 3995627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 39960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables); 3997627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 39980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables); 3999627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 40000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables); 400158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables); 40020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables); 40030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables); 40040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables); 40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = false; 40066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn initTimes(); 40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = 0; 40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = 0; 40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 4013633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = 0; 40146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = 0; 4015633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = 0; 4016c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn initDischarge(); 40170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn clearHistoryLocked(); 40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(Parcel p) { 40211afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 40220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = null; 40230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn clearHistoryLocked(); 40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcel(p); 40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void setCallback(BatteryCallback cb) { 40280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mCallback = cb; 40290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 40300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 4031e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void setNumSpeedSteps(int steps) { 4032e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (sNumSpeedSteps == 0) sNumSpeedSteps = steps; 4033e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 4034e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 4035f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void setRadioScanningTimeout(long timeout) { 4036f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mPhoneSignalScanningTimer != null) { 4037f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.setTimeout(timeout); 4038f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 4039f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 4040f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 40410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 40420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean startIteratingOldHistoryLocked() { 40430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize() 40440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " pos=" + mHistoryBuffer.dataPosition()); 40450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 40461fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mHistoryReadTmp.clear(); 40470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mReadOverflow = false; 40480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = true; 4049ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return (mHistoryIterator = mHistory) != null; 4050ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4051ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 40520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 40530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean getNextOldHistoryLocked(HistoryItem out) { 40540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize(); 40550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!end) { 40561fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mHistoryReadTmp.readDelta(mHistoryBuffer); 40571fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW; 40580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 4059ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn HistoryItem cur = mHistoryIterator; 4060ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (cur == null) { 40610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mReadOverflow && !end) { 40620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "Old history ends before new history!"); 40630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 4064ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return false; 4065ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4066ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn out.setTo(cur); 4067ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mHistoryIterator = cur.next; 40680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mReadOverflow) { 40690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (end) { 40700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "New history ends before old history!"); 40711fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else if (!out.same(mHistoryReadTmp)) { 40720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); 40730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn PrintWriter pw = new PrintWriter(new LogWriter(android.util.Log.WARN, TAG)); 40740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Histories differ!"); 40750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Old history:"); 40760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn (new HistoryPrinter()).printNextItem(pw, out, now); 40770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("New history:"); 40781fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, now); 40790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 40800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 4081ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return true; 4082ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4083ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 40850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void finishIteratingOldHistoryLocked() { 40860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = false; 40870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); 40880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 40890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 40900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 40910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean startIteratingHistoryLocked() { 40920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize() 40930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " pos=" + mHistoryBuffer.dataPosition()); 40940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 40950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mReadOverflow = false; 40960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = true; 40970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return mHistoryBuffer.dataSize() > 0; 40980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 40990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 41000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 41010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean getNextHistoryLocked(HistoryItem out) { 41021fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final int pos = mHistoryBuffer.dataPosition(); 41031fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (pos == 0) { 41041fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn out.clear(); 41051fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 41061fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn boolean end = pos >= mHistoryBuffer.dataSize(); 41070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (end) { 41080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return false; 41090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 41100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 41111fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn out.readDelta(mHistoryBuffer); 41120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return true; 41130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 41140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 41150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 41160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void finishIteratingHistoryLocked() { 41170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = false; 41180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); 411932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 41205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 412132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn @Override 4122b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public long getHistoryBaseTime() { 4123b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn return mHistoryBaseTime; 4124b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 41255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4126b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn @Override 41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStartCount() { 41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartCount; 41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public boolean isScreenOn() { 41369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return mScreenOn; 41379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 41389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 41396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void initTimes() { 41406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mBatteryRealtime = mTrackBatteryPastUptime = 0; 41416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mBatteryUptime = mTrackBatteryPastRealtime = 0; 41426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 41436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 41446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 41456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 41466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4148c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn void initDischarge() { 4149c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mLowDischargeAmountSinceCharge = 0; 4150c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mHighDischargeAmountSinceCharge = 0; 4151c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOn = 0; 4152c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge = 0; 4153c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOff = 0; 4154c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge = 0; 4155c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4156c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 41576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void resetAllStatsLocked() { 41586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStartCount = 0; 41596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn initTimes(); 41609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mScreenOnTimer.reset(this, false); 41616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 41629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mScreenBrightnessTimer[i].reset(this, false); 41636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mInputEventCounter.reset(false); 41659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneOnTimer.reset(this, false); 41669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mAudioOnTimer.reset(this, false); 41679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mVideoOnTimer.reset(this, false); 41685284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 41699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneSignalStrengthsTimer[i].reset(this, false); 41706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneSignalScanningTimer.reset(this, false); 41726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 41739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneDataConnectionsTimer[i].reset(this, false); 41746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWifiOnTimer.reset(this, false); 417658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.reset(this, false); 41779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBluetoothOnTimer.reset(this, false); 41785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 41796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<mUidStats.size(); i++) { 41806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUidStats.valueAt(i).reset()) { 41816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUidStats.remove(mUidStats.keyAt(i)); 41826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn i--; 41836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 41866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mKernelWakelockStats.size() > 0) { 41876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (SamplingTimer timer : mKernelWakelockStats.values()) { 41886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(timer); 41896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mKernelWakelockStats.clear(); 41916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 4193c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn initDischarge(); 41945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 41956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn clearHistoryLocked(); 41966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 41975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 419832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) { 4199c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (oldScreenOn) { 4200c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel; 4201c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (diff > 0) { 4202c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOn += diff; 4203c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge += diff; 4204c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4205c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } else { 4206c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel; 4207c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (diff > 0) { 4208c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOff += diff; 4209c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge += diff; 4210c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4211c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4212c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (newScreenOn) { 4213c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel; 4214c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOffUnplugLevel = 0; 4215c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } else { 4216c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOnUnplugLevel = 0; 4217c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel; 4218c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4219c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4220c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 42216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void setOnBattery(boolean onBattery, int oldStatus, int level) { 42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 422332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn setOnBatteryLocked(onBattery, oldStatus, level); 422432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 422532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 422632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn 422732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn void setOnBatteryLocked(boolean onBattery, int oldStatus, int level) { 422832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn boolean doWrite = false; 422932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE); 423032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn m.arg1 = onBattery ? 1 : 0; 423132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHandler.sendMessage(m); 423232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mOnBattery = mOnBatteryInternal = onBattery; 423332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn 423432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn long uptime = SystemClock.uptimeMillis() * 1000; 423532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn long mSecRealtime = SystemClock.elapsedRealtime(); 423632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn long realtime = mSecRealtime * 1000; 423732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery) { 423832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // We will reset our status if we are unplugging after the 423932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // battery was last full, or the level is at 100, or 424032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // we have gone through a significant charge (from a very low 424132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // level to a now very high level). 424232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (oldStatus == BatteryManager.BATTERY_STATUS_FULL 424332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || level >= 90 424432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || (mDischargeCurrentLevel < 20 && level >= 80)) { 424532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn doWrite = true; 424632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn resetAllStatsLocked(); 424732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeStartLevel = level; 424832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 424932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateKernelWakelocksLocked(); 425032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 425132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 425232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: " 425332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 425432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn addHistoryRecordLocked(mSecRealtime); 425532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryUptimeStart = uptime; 425632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryRealtimeStart = realtime; 425732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime); 425832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime); 425932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeCurrentLevel = mDischargeUnplugLevel = level; 426032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mScreenOn) { 426132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOnUnplugLevel = level; 426232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOffUnplugLevel = 0; 42636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 426432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOnUnplugLevel = 0; 426532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOffUnplugLevel = level; 42666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 426732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeAmountScreenOn = 0; 426832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeAmountScreenOff = 0; 426932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime); 427032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } else { 427132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateKernelWakelocksLocked(); 427232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 427332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 427432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: " 427532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 427632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn addHistoryRecordLocked(mSecRealtime); 427732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; 427832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; 427932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeCurrentLevel = level; 428032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (level < mDischargeUnplugLevel) { 428132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1; 428232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level; 428332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 428432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn); 428532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); 428632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 428732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) { 428832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mFile != null) { 428932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn writeAsyncLocked(); 42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 42946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // This should probably be exposed in the API, though it's not critical 42956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn private static final int BATTERY_PLUGGED_NONE = 0; 42965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 42976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void setBatteryState(int status, int health, int plugType, int level, 42986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int temp, int volt) { 429932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn synchronized(this) { 430032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn boolean onBattery = plugType == BATTERY_PLUGGED_NONE; 430132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn int oldStatus = mHistoryCur.batteryStatus; 430232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (!mHaveBatteryLevel) { 430332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHaveBatteryLevel = true; 430432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // We start out assuming that the device is plugged in (not 430532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // on battery). If our first report is now that we are indeed 430632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // plugged in, then twiddle our state to correctly reflect that 430732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // since we won't be going through the full setOnBattery(). 430832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery == mOnBattery) { 430932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery) { 431032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 431132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } else { 431232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 431332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 43146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 431532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn oldStatus = status; 43166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 431732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery) { 431832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeCurrentLevel = level; 431932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mRecordingHistory = true; 43206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 432132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery != mOnBattery) { 432232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 43236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryStatus = (byte)status; 43246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryHealth = (byte)health; 43256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryPlugType = (byte)plugType; 43266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryTemperature = (char)temp; 43276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryVoltage = (char)volt; 432832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn setOnBatteryLocked(onBattery, oldStatus, level); 432932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } else { 433032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn boolean changed = false; 433132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryLevel != level) { 433232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 433332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 433432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 433532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryStatus != status) { 433632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryStatus = (byte)status; 433732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 433832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 433932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryHealth != health) { 434032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryHealth = (byte)health; 434132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 434232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 434332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryPlugType != plugType) { 434432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryPlugType = (byte)plugType; 434532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 434632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 434732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (temp >= (mHistoryCur.batteryTemperature+10) 434832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || temp <= (mHistoryCur.batteryTemperature-10)) { 434932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryTemperature = (char)temp; 435032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 435132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 435232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (volt > (mHistoryCur.batteryVoltage+20) 435332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || volt < (mHistoryCur.batteryVoltage-20)) { 435432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryVoltage = (char)volt; 435532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 435632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 435732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (changed) { 435832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 435932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 43606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 436132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) { 436232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // We don't record history while we are plugged in and fully charged. 436332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // The next time we are unplugged, history will be cleared. 436432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mRecordingHistory = false; 43656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 43666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4367633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 43685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4369c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateKernelWakelocksLocked() { 4370c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = readKernelWakelockStats(); 43715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4372d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen if (m == null) { 4373d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen // Not crashing might make board bringup easier. 43741afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "Couldn't get kernel wake lock stats"); 4375d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen return; 4376d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen } 4377d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen 4378c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) { 4379c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name = ent.getKey(); 4380c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kws = ent.getValue(); 43815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4382c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 4383c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 43845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 4385c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 4386c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 4387c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4388c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedCount(kws.mCount); 4389c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); 4390c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.setUpdateVersion(sKernelWakelockUpdateVersion); 4391c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 43925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4393c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != mKernelWakelockStats.size()) { 4394c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Set timers to stale if they didn't appear in /proc/wakelocks this time. 4395c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 4396c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer st = ent.getValue(); 4397c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) { 4398c64edde69d18498fb2954f71a546357b07ab996aEvan Millar st.setStale(); 4399c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4400c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4401c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4402c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 44039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 44059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); 44069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery(); 44109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeUptime(long curTime, int which) { 44149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 44156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart); 44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastUptime; 44179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mUptimeStart); 44186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart); 44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeRealtime(long curTime, int which) { 44259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 44266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart); 44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastRealtime; 44289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mRealtimeStart); 44296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart); 44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryUptime(long curTime, int which) { 44369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 44376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: 44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryUptime + getBatteryUptime(curTime); 44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastUptime; 44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(curTime); 44436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: 44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime; 44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryRealtime(long curTime, int which) { 44519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 44526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: 44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryRealtime + getBatteryRealtimeLocked(curTime); 44549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastRealtime; 44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 44579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 44586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: 44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime; 44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked(long curTime) { 44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastUptime; 44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryUptimeStart; 44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked() { 44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(SystemClock.uptimeMillis() * 1000); 44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryUptime(long curTime) { 44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime); 44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryRealtimeLocked(long curTime) { 44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastRealtime; 44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryRealtimeStart; 44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryRealtime(long curTime) { 44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 44943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long getTcpBytes(long current, long[] dataBytes, int which) { 44953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (which == STATS_LAST) { 44963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 44973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 44986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 44996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) { 45003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 45013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 45026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return current - dataBytes[STATS_SINCE_UNPLUGGED]; 45033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 45056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED]; 45063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return current - dataBytes[STATS_CURRENT]; 45083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 45113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 45123718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesSent(int which) { 45131719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getMobileTxBytes(), mMobileDataTx, which); 45143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 45163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 45173718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesReceived(int which) { 45181719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getMobileRxBytes(), mMobileDataRx, which); 45193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 45213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 45223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesSent(int which) { 45231719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getTotalTxBytes(), mTotalDataTx, which); 45243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 45263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 45273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesReceived(int which) { 45281719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getTotalRxBytes(), mTotalDataRx, which); 45293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 45303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 4531105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 4532633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevel() { 4533105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 4534633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeStartLevelLocked(); 4535105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4536105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 45375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4538633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevelLocked() { 45396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mDischargeUnplugLevel; 4540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 45415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4542105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 4543633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevel() { 4544105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 4545633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeCurrentLevelLocked(); 4546105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 45485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4549633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevelLocked() { 4550e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return mDischargeCurrentLevel; 4551105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4553e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 45543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public int getLowDischargeAmountSinceCharge() { 45553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn synchronized(this) { 4556e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int val = mLowDischargeAmountSinceCharge; 4557e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) { 4558e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn val += mDischargeUnplugLevel-mDischargeCurrentLevel-1; 4559e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 4560e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return val; 45613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 45623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 45633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 45643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn @Override 45653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public int getHighDischargeAmountSinceCharge() { 45663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn synchronized(this) { 4567e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int val = mHighDischargeAmountSinceCharge; 4568e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) { 4569e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn val += mDischargeUnplugLevel-mDischargeCurrentLevel; 4570e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 4571e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return val; 45723bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 45733bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 4574c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4575c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOn() { 4576c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4577c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOn; 4578c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && mScreenOn 4579c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) { 4580c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel; 4581c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4582c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4583c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4584c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4585c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4586c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOnSinceCharge() { 4587c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4588c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOnSinceCharge; 4589c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && mScreenOn 4590c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) { 4591c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel; 4592c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4593c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4594c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4595c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4596c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4597c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOff() { 4598c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4599c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOff; 4600c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && !mScreenOn 4601c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) { 4602c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel; 4603c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4604c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4605c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4606c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4607c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4608c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOffSinceCharge() { 4609c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4610c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOffSinceCharge; 4611c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && !mScreenOn 4612c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) { 4613c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel; 4614c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4615c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4616c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4617c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 46183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 46193bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn @Override 4620e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public int getCpuSpeedSteps() { 4621e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return sNumSpeedSteps; 4622e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 4623e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 46249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 46259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular uid, creating if needed. 46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid getUidStatsLocked(int uid) { 46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.get(uid); 46299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u == null) { 46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u = new Uid(uid); 46319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u; 46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 46379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the statistics object for a particular uid. 46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeUidStatsLocked(int uid) { 46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.remove(uid); 46419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 464232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Proc getProcessStatsLocked(int uid, String name) { 46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 46499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getProcessStatsLocked(name); 46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 465332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * Retrieve the statistics object for a particular process, given 465432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * the name of the process. 465532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @param name process name 465632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @return the statistics object for the process 465732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani */ 4658819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani public Uid.Proc getProcessStatsLocked(String name, int pid) { 465932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani int uid; 466032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani if (mUidCache.containsKey(name)) { 466132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani uid = mUidCache.get(name); 466232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } else { 4663819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani uid = Process.getUidForPid(pid); 466432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mUidCache.put(name, uid); 466532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 466632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani Uid u = getUidStatsLocked(uid); 466732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return u.getProcessStatsLocked(name); 466832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 466932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 467032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani /** 46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 46729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 46739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg getPackageStatsLocked(int uid, String pkg) { 46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 46769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getPackageStatsLocked(pkg); 46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 46809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 46819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) { 46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getServiceStatsLocked(pkg, name); 46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 468858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn /** 468958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn * Massage data to distribute any reasonable work down to more specific 469058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn * owners. Must only be called on a dead BatteryStats object! 469158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn */ 469258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void distributeWorkLocked(int which) { 469358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn // Aggregate all CPU time associated with WIFI. 469458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid wifiUid = mUidStats.get(Process.WIFI_UID); 469558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (wifiUid != null) { 469658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which); 469758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (Uid.Proc proc : wifiUid.mProcessStats.values()) { 469858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which); 469958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<mUidStats.size(); i++) { 470058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid uid = mUidStats.valueAt(i); 470158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uid.mUid != Process.WIFI_UID) { 470258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uidRunningTime = uid.getWifiRunningTime(uSecTime, which); 470358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uidRunningTime > 0) { 470458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*"); 470558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long time = proc.getUserTime(which); 470658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 470758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mUserTime += time; 470858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mUserTime -= time; 470958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = proc.getSystemTime(which); 471058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 471158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mSystemTime += time; 471258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mSystemTime -= time; 471358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = proc.getForegroundTime(which); 471458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 471558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mForegroundTime += time; 471658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mForegroundTime -= time; 471758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int sb=0; sb<proc.mSpeedBins.length; sb++) { 471858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn SamplingCounter sc = proc.mSpeedBins[sb]; 471958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (sc != null) { 472058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = sc.getCountLocked(which); 472158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 472258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn SamplingCounter uidSc = uidProc.mSpeedBins[sb]; 472358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uidSc == null) { 472458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidSc = new SamplingCounter(mUnpluggables); 472558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mSpeedBins[sb] = uidSc; 472658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 472758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidSc.mCount.addAndGet((int)time); 472858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn sc.mCount.addAndGet((int)-time); 472958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn totalRunningTime -= uidRunningTime; 473258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 47396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void shutdownLocked() { 4740ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeSyncLocked(); 47416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mShuttingDown = true; 47421afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 47435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4744ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Parcel mPendingWrite = null; 4745ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn final ReentrantLock mWriteLock = new ReentrantLock(); 4746ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4747ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void writeAsyncLocked() { 4748ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeLocked(false); 4749ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4750ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4751ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void writeSyncLocked() { 4752ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeLocked(true); 4753ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4754ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4755ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn void writeLocked(boolean sync) { 47561afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 47571afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "writeLocked: no file associated with this instance"); 47589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 47599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mShuttingDown) { 47626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 47636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 47645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4765ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Parcel out = Parcel.obtain(); 4766ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeSummaryToParcel(out); 4767ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mLastWriteTime = SystemClock.elapsedRealtime(); 4768ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4769ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (mPendingWrite != null) { 4770ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite.recycle(); 4771ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4772ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite = out; 4773ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4774ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (sync) { 4775ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn commitPendingDataToDisk(); 4776ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } else { 4777ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Thread thr = new Thread("BatteryStats-Write") { 4778ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn @Override 4779ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void run() { 4780ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 4781ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn commitPendingDataToDisk(); 4782ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4783ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn }; 4784ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn thr.start(); 4785ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4786ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4787ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4788ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void commitPendingDataToDisk() { 4789f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn final Parcel next; 4790ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn synchronized (this) { 4791ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn next = mPendingWrite; 4792ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite = null; 4793f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn if (next == null) { 4794f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn return; 4795f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn } 4796ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4797ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mWriteLock.lock(); 4798ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4799ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 48009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 48011afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite()); 4802ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn stream.write(next.marshall()); 48039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.flush(); 48048bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn FileUtils.sync(stream); 48059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 48061afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile.commit(); 48079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 48081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "Error writing battery statistics", e); 4809ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mFile.rollback(); 4810ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } finally { 4811ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn next.recycle(); 4812ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mWriteLock.unlock(); 48139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static byte[] readFully(FileInputStream stream) throws java.io.IOException { 48179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 48189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int avail = stream.available(); 48199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[avail]; 48209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 48219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int amt = stream.read(data, pos, data.length-pos); 48229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "Read " + amt + " bytes at " + pos 48239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " of avail " + data.length); 48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt <= 0) { 48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "**** FINISHED READING: pos=" + pos 48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " len=" + data.length); 48279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 48289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos += amt; 48309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project avail = stream.available(); 48319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (avail > data.length-pos) { 48329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] newData = new byte[pos+avail]; 48339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(data, 0, newData, 0, pos); 48349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = newData; 48359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readLocked() { 48401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 48411afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readLocked: no file associated with this instance"); 48429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 48439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 48469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 48481afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn File file = mFile.chooseForRead(); 48491afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (!file.exists()) { 48501afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 48519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48521afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileInputStream stream = new FileInputStream(file); 48539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] raw = readFully(stream); 48559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in = Parcel.obtain(); 48569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.unmarshall(raw, 0, raw.length); 48579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.setDataPosition(0); 48589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 48599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSummaryFromParcel(in); 48619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(java.io.IOException e) { 48621afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.e("BatteryStats", "Error reading battery statistics", e); 48639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 48650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long now = SystemClock.elapsedRealtime(); 48660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryRecordLocked(now, HistoryItem.CMD_START); 48670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(now, HistoryItem.CMD_START); 48689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 48719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 48729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4874ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn void readHistory(Parcel in, boolean andOldHistory) { 4875ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn final long historyBaseTime = in.readLong(); 48760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 48770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataSize(0); 48780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 48790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 48800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int bufSize = in.readInt(); 48810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int curPos = in.dataPosition(); 48820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) { 48830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "File corrupt: history data buffer too large " + bufSize); 48840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ((bufSize&~3) != bufSize) { 48850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "File corrupt: history data buffer not aligned " + bufSize); 48860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else { 48870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "***************** READING NEW HISTORY: " + bufSize 48880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " bytes at " + curPos); 48890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.appendFrom(in, curPos, bufSize); 48900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn in.setDataPosition(curPos + bufSize); 489132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 48925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4893ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (andOldHistory) { 4894ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn readOldHistory(in); 4895ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 4896ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 4897ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (DEBUG_HISTORY) { 4898ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn StringBuilder sb = new StringBuilder(128); 4899ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append("****************** OLD mHistoryBaseTime: "); 4900ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mHistoryBaseTime, sb); 4901ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn Slog.i(TAG, sb.toString()); 4902ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 4903ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn mHistoryBaseTime = historyBaseTime; 4904ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (DEBUG_HISTORY) { 4905ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn StringBuilder sb = new StringBuilder(128); 4906ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append("****************** NEW mHistoryBaseTime: "); 4907ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mHistoryBaseTime, sb); 4908ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn Slog.i(TAG, sb.toString()); 4909ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 4910ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 4911ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn // We are just arbitrarily going to insert 1 minute from the sample of 4912ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn // the last run until samples in this run. 4913ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (mHistoryBaseTime > 0) { 4914ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn long oldnow = SystemClock.elapsedRealtime(); 4915ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn mHistoryBaseTime = (mHistoryBaseTime - oldnow) + 60*1000; 4916ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (DEBUG_HISTORY) { 4917ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn StringBuilder sb = new StringBuilder(128); 4918ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append("****************** ADJUSTED mHistoryBaseTime: "); 4919ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mHistoryBaseTime, sb); 4920ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn Slog.i(TAG, sb.toString()); 4921ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 49221e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn } 492332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 49245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void readOldHistory(Parcel in) { 49260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistory = mHistoryEnd = mHistoryCache = null; 49270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long time; 49285e3357fcee2a23a08434873a89e8ada4c6e6d893Conley Owens while (in.dataAvail() > 0 && (time=in.readLong()) >= 0) { 49290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn HistoryItem rec = new HistoryItem(time, in); 49300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryRecordLocked(rec); 49310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 49320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 49330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 4934ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn void writeHistory(Parcel out, boolean andOldHistory) { 4935ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (DEBUG_HISTORY) { 4936ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn StringBuilder sb = new StringBuilder(128); 4937ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append("****************** WRITING mHistoryBaseTime: "); 4938ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mHistoryBaseTime, sb); 4939ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append(" mLastHistoryTime: "); 4940ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mLastHistoryTime, sb); 4941ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn Slog.i(TAG, sb.toString()); 4942ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 4943ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn out.writeLong(mHistoryBaseTime + mLastHistoryTime); 49440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn out.writeInt(mHistoryBuffer.dataSize()); 49450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: " 49460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition()); 49470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize()); 4948ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 4949ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (andOldHistory) { 4950ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn writeOldHistory(out); 4951ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 49520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 49530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 49540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void writeOldHistory(Parcel out) { 49556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem rec = mHistory; 495632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn while (rec != null) { 495732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec.time >= 0) rec.writeToParcel(out, 0); 495832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec = rec.next; 495932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 496032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn out.writeLong(-1); 496132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 49625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSummaryFromParcel(Parcel in) { 49649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int version = in.readInt(); 49659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (version != VERSION) { 49661afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readFromParcel: version got " + version 49679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", expected " + VERSION + "; erasing old stats"); 49689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 49699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4971ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn readHistory(in, true); 49725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 49749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 49759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 49779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 49786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = in.readInt(); 4979633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 49803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = in.readInt(); 49813bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = in.readInt(); 4982c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge = in.readInt(); 4983c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge = in.readInt(); 49845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 49865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 49879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 49889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.readSummaryFromParcelLocked(in); 4989617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 4990617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); 4991617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4992617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.readSummaryFromParcelLocked(in); 49939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 49949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.readSummaryFromParcelLocked(in); 49955284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 4996627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in); 4997627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 4998f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in); 4999627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 5000627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in); 5001627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5002105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 5003105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.readSummaryFromParcelLocked(in); 500458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 500558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in); 5006105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 5007105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.readSummaryFromParcelLocked(in); 50089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 50101afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NKW > 10000) { 50111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW); 50121afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 50131afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 5014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 5015c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 5016c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String kwltName = in.readString(); 5017c64edde69d18498fb2954f71a546357b07ab996aEvan Millar getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in); 5018c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5019c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5020e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 5021e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 5022e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 50239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = in.readInt(); 50241afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NU > 10000) { 50251afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many uids " + NU); 50261afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 50271afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 50289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 50299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 50309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 50319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 50329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 503358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunning = false; 50346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 503558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunningTimer.readSummaryFromParcelLocked(in); 50366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5037105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockOut = false; 50386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); 50406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5041105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockOut = false; 50426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); 50446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 50455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastEnabled = false; 50466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mWifiMulticastTimer.readSummaryFromParcelLocked(in); 50486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 50496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOn = false; 50506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in); 50526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 50536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOn = false; 50546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 50556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in); 50566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 50575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 5058617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() != 0) { 5059617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 5060617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.initUserActivityLocked(); 5061617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5062617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 5063617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); 5064617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5065617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 50665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 50679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = in.readInt(); 50687b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NW > 100) { 50691afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many wake locks " + NW); 50701afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 50711afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 50729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iw = 0; iw < NW; iw++) { 50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wlName = in.readString(); 50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in); 50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in); 50799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 50819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in); 50829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = in.readInt(); 50867b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NP > 1000) { 50871afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many sensors " + NP); 50881afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 50891afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 50909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NP; is++) { 50919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int seNumber = in.readInt(); 50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getSensorTimerLocked(seNumber, true) 50949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .readSummaryFromParcelLocked(in); 50959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 50997b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NP > 1000) { 51001afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many processes " + NP); 51011afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 51021afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 51049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String procName = in.readString(); 51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc p = u.getProcessStatsLocked(procName); 51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mUserTime = p.mLoadedUserTime = in.readLong(); 51079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mSystemTime = p.mLoadedSystemTime = in.readLong(); 51089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStarts = p.mLoadedStarts = in.readInt(); 510958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int NSB = in.readInt(); 51107b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NSB > 100) { 51117b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn Slog.w(TAG, "File corrupt: too many speed bins " + NSB); 51127b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return; 51137b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 511458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins = new SamplingCounter[NSB]; 511558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<NSB; i++) { 511658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (in.readInt() != 0) { 511758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins[i] = new SamplingCounter(mUnpluggables); 511858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins[i].readSummaryFromParcelLocked(in); 511958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 512058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 51217b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (!p.readExcessivePowerFromParcelLocked(in)) { 51227b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return; 51237b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 51271afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NP > 10000) { 51281afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many packages " + NP); 51291afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 51301afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = in.readString(); 51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg p = u.getPackageStatsLocked(pkgName); 51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mWakeups = p.mLoadedWakeups = in.readInt(); 51359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = in.readInt(); 51367b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NS > 1000) { 51377b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn Slog.w(TAG, "File corrupt: too many services " + NS); 51387b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return; 51397b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 51409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NS; is++) { 51419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String servName = in.readString(); 51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); 51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStartTime = s.mLoadedStartTime = in.readLong(); 51449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStarts = s.mLoadedStarts = in.readInt(); 51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLaunches = s.mLoadedLaunches = in.readInt(); 51469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesReceived = in.readLong(); 51509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesSent = in.readLong(); 51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a summary of the statistics to a Parcel, in a format suitable to be written to 51569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disk. This format does not allow a lossless round-trip. 51579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 51589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 51609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeSummaryToParcel(Parcel out) { 51610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Need to update with current kernel wake lock counts. 51620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn updateKernelWakelocksLocked(); 51630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 51649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW_SYS = SystemClock.uptimeMillis() * 1000; 51659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000; 51669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW = getBatteryUptimeLocked(NOW_SYS); 51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS); 51689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(VERSION); 51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5171ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn writeHistory(out, true); 51725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 51739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 51746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED)); 51756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); 51766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED)); 51776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); 51786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(mDischargeUnplugLevel); 5179633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 5180e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn out.writeInt(getLowDischargeAmountSinceCharge()); 5181e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn out.writeInt(getHighDischargeAmountSinceCharge()); 5182c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(getDischargeAmountScreenOnSinceCharge()); 5183c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(getDischargeAmountScreenOffSinceCharge()); 51849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5186617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 5187617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 5188617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5189617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeSummaryFromParcelLocked(out); 51909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 51915284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 5192627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 5193627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5194f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5195627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 5196627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 5197627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5198105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 519958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5200105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5202c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 5203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 5204c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer kwlt = ent.getValue(); 5205c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 5206c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 5207c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 5208c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL); 5209c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 5210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 5211c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5212c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 52135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5214e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = mUidStats.size(); 52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NU); 52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(iu)); 52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 52205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 522158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (u.mWifiRunningTimer != null) { 52226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 522358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mFullWifiLockTimer != null) { 52286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 52296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mScanWifiLockTimer != null) { 52346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 52356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mWifiMulticastTimer != null) { 52406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 52416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mAudioTurnedOnTimer != null) { 52466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 52476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mVideoTurnedOnTimer != null) { 52526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 52536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 52546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 52556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 52566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 5259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 5260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 5261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 5262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 5263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); 5264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 52665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = u.mWakelockStats.size(); 52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NW); 52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent 52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mWakelockStats.entrySet()) { 52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerFull != null) { 52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL); 52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 52789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerPartial != null) { 52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL); 52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerWindow != null) { 52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL); 52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 52919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 52959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NSE = u.mSensorStats.size(); 52969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NSE); 52979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NSE > 0) { 52989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent 52999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mSensorStats.entrySet()) { 53009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ent.getKey()); 53019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 53029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se.mTimer != null) { 53039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 53049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL); 53059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 53069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 53079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = u.mProcessStats.size(); 53129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 53139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 53149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent 53159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mProcessStats.entrySet()) { 53169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 53179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 53189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime); 53199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime); 53209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts); 532158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final int N = ps.mSpeedBins.length; 532258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(N); 532358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 532458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (ps.mSpeedBins[i] != null) { 532558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(1); 532658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn ps.mSpeedBins[i].writeSummaryFromParcelLocked(out); 532758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 532858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(0); 532958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 533058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 5331287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ps.writeExcessivePowerToParcelLocked(out); 53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = u.mPackageStats.size(); 53369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 53379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 53389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent 53399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mPackageStats.entrySet()) { 53409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 53419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 53429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups); 53439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = ps.mServiceStats.size(); 53449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NS); 53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NS > 0) { 53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent 53479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : ps.mServiceStats.entrySet()) { 53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(sent.getKey()); 53499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue(); 53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = ss.getStartTimeToNowLocked(NOW); 53519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time); 53529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts); 53539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches); 53549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 53596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED)); 53606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED)); 53619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readFromParcel(Parcel in) { 53659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcelLocked(in); 53669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 53689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 53699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = in.readInt(); 53709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != MAGIC) { 53719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ParcelFormatException("Bad magic number"); 53729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5374ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn readHistory(in, false); 53755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 53769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 53783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mBatteryLastUptime = 0; 53799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 53803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mBatteryLastRealtime = 0; 53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 53820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in); 5383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 53840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, 53850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5387617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables, in); 53889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 53890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 53905284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 53910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, 53920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5393627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 53940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in); 5395627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 53960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, 53970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5398627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5399105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 54000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 540158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 540258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 5403105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 54040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 54059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = in.readLong(); 54073bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastUptime = 0; 54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = in.readLong(); 54103bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastRealtime = 0; 54119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = in.readInt() != 0; 54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBatteryInternal = false; // we are no longer really running. 54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = in.readLong(); 54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = in.readLong(); 54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = in.readLong(); 54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = in.readLong(); 54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = in.readLong(); 54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = in.readLong(); 54196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = in.readInt(); 5420633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 54213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = in.readInt(); 54223bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = in.readInt(); 5423c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOn = in.readInt(); 5424c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge = in.readInt(); 5425c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOff = in.readInt(); 5426c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge = in.readInt(); 54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = in.readLong(); 54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataRx[STATS_LAST] = in.readLong(); 54306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1; 54313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataTx[STATS_LAST] = in.readLong(); 54326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1; 54333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataRx[STATS_LAST] = in.readLong(); 54346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1; 54353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataTx[STATS_LAST] = in.readLong(); 54366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1; 54373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 54383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = in.readLong(); 54393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 54403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 54413f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = in.readInt(); 54423f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 54433f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 5444c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.clear(); 5445c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 5446c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 5447c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 5448c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String wakelockName = in.readString(); 5449244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel 5450c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); 5451c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(wakelockName, kwlt); 5452c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5453c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 54545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 54559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers.clear(); 54569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers.clear(); 54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers.clear(); 545858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers.clear(); 545958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers.clear(); 546058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers.clear(); 546158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers.clear(); 54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5463e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 5464e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 54659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numUids = in.readInt(); 54669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 54679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numUids; i++) { 54689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 54699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 54709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.readFromParcelLocked(mUnpluggables, in); 54719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.append(uid, u); 54729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 54763bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn writeToParcelLocked(out, true, flags); 54773bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 54783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 54793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public void writeToParcelWithoutUids(Parcel out, int flags) { 54803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn writeToParcelLocked(out, false, flags); 54819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 54835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @SuppressWarnings("unused") 54843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn void writeToParcelLocked(Parcel out, boolean inclUids, int flags) { 54850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Need to update with current kernel wake lock counts. 54860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn updateKernelWakelocksLocked(); 54870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecUptime = SystemClock.uptimeMillis() * 1000; 54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptimeLocked(uSecUptime); 54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 54925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(MAGIC); 54945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5495ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn writeHistory(out, false); 54965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 54979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 54989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryUptime); 54999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryRealtime); 55009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeToParcel(out, batteryRealtime); 5501617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 5502617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime); 5503617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5504617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeToParcel(out); 55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeToParcel(out, batteryRealtime); 55065284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 5507627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime); 5508627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5509f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime); 5510627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 5511627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime); 5512627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5513105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeToParcel(out, batteryRealtime); 551458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime); 5515105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeToParcel(out, batteryRealtime); 55169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptime); 55179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptimeStart); 55189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtime); 55199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtimeStart); 55209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mOnBattery ? 1 : 0); 55219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryUptime); 55229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryUptimeStart); 55239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryRealtime); 55249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryRealtimeStart); 55259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryUptime); 55269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryRealtime); 55276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(mDischargeUnplugLevel); 5528633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 55293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mLowDischargeAmountSinceCharge); 55303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mHighDischargeAmountSinceCharge); 5531c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOn); 5532c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOnSinceCharge); 5533c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOff); 5534c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOffSinceCharge); 55359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastWriteTime); 55369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED)); 55386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED)); 55396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED)); 55406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED)); 55413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 55423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Write radio uptime for data 55433f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeLong(getRadioDataUptime()); 55443f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 55453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeInt(getBluetoothPingCount()); 55463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 55473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (inclUids) { 55483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mKernelWakelockStats.size()); 55493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 55503bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn SamplingTimer kwlt = ent.getValue(); 55513bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (kwlt != null) { 55523bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(1); 55533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeString(ent.getKey()); 55543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn Timer.writeTimerToParcel(out, kwlt, batteryRealtime); 55553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 55563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 55573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 5558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 55593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 55603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 5561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5562e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 5563e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 5564e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 55653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (inclUids) { 55663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int size = mUidStats.size(); 55673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(size); 55683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn for (int i = 0; i < size; i++) { 55693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mUidStats.keyAt(i)); 55703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn Uid uid = mUidStats.valueAt(i); 55719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55723bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn uid.writeToParcelLocked(out, batteryRealtime); 55733bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 55743bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 55753bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 55769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<BatteryStatsImpl> CREATOR = 55809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<BatteryStatsImpl>() { 55819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl createFromParcel(Parcel in) { 55829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl(in); 55839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 55859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl[] newArray(int size) { 55869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl[size]; 55879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 55895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 55900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void prepareForDumpLocked() { 55910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Need to retrieve current kernel wake lock stats before printing. 55920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn updateKernelWakelocksLocked(); 55930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 55940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 55951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void dumpLocked(PrintWriter pw) { 55969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) { 55971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 55981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen timer:"); 55991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenOnTimer.logState(pr, " "); 5600617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 56011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen brightness #" + i + ":"); 56021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenBrightnessTimer[i].logState(pr, " "); 5603617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 56041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Input event counter:"); 56051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mInputEventCounter.logState(pr, " "); 56061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Phone timer:"); 56071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneOnTimer.logState(pr, " "); 56085284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 56091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Signal strength #" + i + ":"); 56101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneSignalStrengthsTimer[i].logState(pr, " "); 5611627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5612f37447bad3773b62176baa837908daf6edb44273Amith Yamasani pr.println("*** Signal scanning :"); 5613f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.logState(pr, " "); 5614627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 56151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Data connection type #" + i + ":"); 56161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneDataConnectionsTimer[i].logState(pr, " "); 56171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 56181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Wifi timer:"); 56191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiOnTimer.logState(pr, " "); 56201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** WifiRunning timer:"); 562158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.logState(pr, " "); 56221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Bluetooth timer:"); 56231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mBluetoothOnTimer.logState(pr, " "); 56249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dumpLocked(pw); 56269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5628