BatteryStatsImpl.java revision 8bdf5935c0db4a66ab33a10b43398d2523cfa15d
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 213f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset; 221719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriffimport android.net.TrafficStats; 236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackbornimport android.os.BatteryManager; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats; 258bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils; 260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Handler; 270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Message; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 31c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 34f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState; 35e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 36627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport android.util.Slog; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 52c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 544cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger; 55ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackbornimport java.util.concurrent.locks.ReentrantLock; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. All times are represented in microseconds except where indicated 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "BatteryStatsImpl"; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG = false; 6532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn private static final boolean DEBUG_HISTORY = false; 6632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAGIC = 0xBA757475; // 'BATSTATS' 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Current on-disk Parcel version 71287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn private static final int VERSION = 52; 72e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // Maximum number of items we will record in the history. 747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private static final int MAX_HISTORY_ITEMS = 2000; 756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 76f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // No, really, THIS is the maximum number of items we will record in the history. 77f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn private static final int MAX_MAX_HISTORY_ITEMS = 3000; 78f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 799e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // The maximum number of names wakelocks we will keep track of 809e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // per uid; once the limit is reached, we batch the remaining wakelocks 819e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // in to one common name. 827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private static final int MAX_WAKELOCKS_PER_UID = 30; 839e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn 849e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn private static final String BATCHED_WAKELOCK_NAME = "*overflow*"; 859e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn 86e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani private static int sNumSpeedSteps; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 881afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn private final JournaledFile mFile; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn static final int MSG_UPDATE_WAKELOCKS = 1; 910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn static final int MSG_REPORT_POWER_CHANGE = 2; 92287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final long DELAY_UPDATE_WAKELOCKS = 5*1000; 930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public interface BatteryCallback { 950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void batteryNeedsCpuUpdate(); 960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void batteryPowerChanged(boolean onBattery); 970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final class MyHandler extends Handler { 1000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn @Override 1010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void handleMessage(Message msg) { 1020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn BatteryCallback cb = mCallback; 1030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn switch (msg.what) { 1040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn case MSG_UPDATE_WAKELOCKS: 1050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (cb != null) { 1060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn cb.batteryNeedsCpuUpdate(); 1070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn break; 1090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn case MSG_REPORT_POWER_CHANGE: 1100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (cb != null) { 1110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn cb.batteryPowerChanged(msg.arg1 != 0); 1120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn break; 1140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn private final MyHandler mHandler; 1190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn private BatteryCallback mCallback; 1210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected organized by uids. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SparseArray<BatteryStatsImpl.Uid> mUidStats = 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SparseArray<BatteryStatsImpl.Uid>(); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A set of pools of currently active timers. When a timer is queried, we will divide the 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // elapsed time by the number of active timers to arrive at that timer's share of the time. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In order to do this, we must refresh each timer whenever the number of active timers 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes. 132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>(); 133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>(); 134c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>(); 135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers 136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar = new SparseArray<ArrayList<StopwatchTimer>>(); 13758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>(); 13858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>(); 13958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mScanWifiLockTimers = new ArrayList<StopwatchTimer>(); 14058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>(); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // Last partial timers we use for distributing CPU usage. 1430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>(); 1440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are the objects that will want to do something when the device 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is unplugged from power. 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mShuttingDown; 1506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 1516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long mHistoryBaseTime; 1526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mHaveBatteryLevel = false; 1536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mRecordingHistory = true; 1546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int mNumHistoryItems; 1556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistory; 1566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistoryEnd; 1579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn HistoryItem mHistoryLastEnd; 1586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistoryCache; 1596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn final HistoryItem mHistoryCur = new HistoryItem(); 16032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStartCount; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryUptime; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastUptime; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryRealtime; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastRealtime; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptime; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptimeStart; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUptime; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtime; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtimeStart; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastRealtime; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mScreenOn; 176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScreenOnTimer; 1773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 178617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mScreenBrightnessBin = -1; 179c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; 180617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 181617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter mInputEventCounter; 182617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mPhoneOn; 184c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mPhoneOnTimer; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 186244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioOn; 187244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioOnTimer; 188244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 189244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoOn; 190244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoOnTimer; 191244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 192627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneSignalStrengthBin = -1; 193c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneSignalStrengthsTimer = 194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS]; 195f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 196f37447bad3773b62176baa837908daf6edb44273Amith Yamasani StopwatchTimer mPhoneSignalScanningTimer; 197f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 198627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneDataConnectionType = -1; 199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneDataConnectionsTimer = 200c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_DATA_CONNECTION_TYPES]; 201627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 202105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mWifiOn; 203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiOnTimer; 204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mWifiOnUid = -1; 205d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 20658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn boolean mGlobalWifiRunning; 20758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn StopwatchTimer mGlobalWifiRunningTimer; 208105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 209105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mBluetoothOn; 210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mBluetoothOnTimer; 2113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 2123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** Bluetooth headset object */ 2133f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani BluetoothHeadset mBtHeadset; 2143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These provide time bases that discount the time the device is plugged 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in to power. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBattery; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBatteryInternal; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastUptime; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryUptimeStart; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastRealtime; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryRealtimeStart; 2253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryUptime; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryRealtime; 2283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 229105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /* 230105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * These keep track of battery levels (1-100) at the last plug event and the last unplug event. 231105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 232633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeStartLevel; 2336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int mDischargeUnplugLevel; 234633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeCurrentLevel; 2353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int mLowDischargeAmountSinceCharge; 2363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int mHighDischargeAmountSinceCharge; 237244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastWriteTime = 0; // Milliseconds 239244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Mobile data transferred while on battery 2413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataTx = new long[4]; 2423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataRx = new long[4]; 2433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataTx = new long[4]; 2443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataRx = new long[4]; 2453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataUptime; 2473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataStart; 2483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingCount; 2503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingStart = -1; 2513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 252f37447bad3773b62176baa837908daf6edb44273Amith Yamasani private int mPhoneServiceState = -1; 253f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 254c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 255c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Holds a SamplingTimer associated with each kernel wakelock name being tracked. 256c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 257c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final HashMap<String, SamplingTimer> mKernelWakelockStats = 258c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, SamplingTimer>(); 259c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 260c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public Map<String, ? extends SamplingTimer> getKernelWakelockStats() { 261c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mKernelWakelockStats; 262c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 263c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 264c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static int sKernelWakelockUpdateVersion = 0; 265c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 266c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static final int[] PROC_WAKELOCKS_FORMAT = new int[] { 267c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_STRING, // 0: name 268c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 1: count 269c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 270c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 271c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 272c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 5: totalTime 273c64edde69d18498fb2954f71a546357b07ab996aEvan Millar }; 274c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 275c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final String[] mProcWakelocksName = new String[3]; 276c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final long[] mProcWakelocksData = new long[3]; 277c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 278c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 279c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added 280c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * to mKernelWakelockStats. 281c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 282c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> mProcWakelockFileStats = 283c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, KernelWakelockStats>(); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>(); 28632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For debugging 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl() { 2891afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 2900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = null; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface Unpluggable { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unplug(long batteryUptime, long batteryRealtime); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void plug(long batteryUptime, long batteryRealtime); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * State for keeping track of counting information. 300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 301e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class Counter extends BatteryStats.Counter implements Unpluggable { 3024cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate final AtomicInteger mCount = new AtomicInteger(); 3036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn final ArrayList<Unpluggable> mUnpluggables; 304617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLoadedCount; 305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLastCount; 306617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mUnpluggedCount; 307617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mPluggedCount; 308617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 309617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables, Parcel in) { 3106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 3114cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = in.readInt(); 3124cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 313617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLoadedCount = in.readInt(); 3143bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 315617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = in.readInt(); 316617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 317617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 318617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 319617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables) { 3206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 321617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 322617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 323617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 324617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void writeToParcel(Parcel out) { 3254cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(mCount.get()); 326617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLoadedCount); 327617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mUnpluggedCount); 328617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 329617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 330617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void unplug(long batteryUptime, long batteryRealtime) { 3314cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount; 3324cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 333617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 334617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 335617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void plug(long batteryUptime, long batteryRealtime) { 3364cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = mCount.get(); 337617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 338617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 339617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 340617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * Writes a possibly null Counter to a Parcel. 341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 342617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param out the Parcel to be written to. 343617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param counter a Counter, or null. 344617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 345617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static void writeCounterToParcel(Parcel out, Counter counter) { 346617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (counter == null) { 347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); // indicates null 348617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return; 349617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); // indicates non-null 351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn counter.writeToParcel(out); 353617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 356c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int val; 358617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_LAST) { 359617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val = mLastCount; 360617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 3614cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate val = mCount.get(); 3626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mUnpluggedCount; 3646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 365617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mLoadedCount; 366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 367617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return val; 370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void logState(Printer pw, String prefix) { 3734cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate pw.println(prefix + "mCount=" + mCount.get() 374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mUnpluggedCount=" + mUnpluggedCount 376617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mPluggedCount=" + mPluggedCount); 377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 3794cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate void stepAtomic() { 3804cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.incrementAndGet(); 381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 3836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 3846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear state of this counter. 3856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 3866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void reset(boolean detachIfReset) { 3876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCount.set(0); 3886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0; 3896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (detachIfReset) { 3906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn detach(); 3916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 3946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 3956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 3966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void writeSummaryFromParcelLocked(Parcel out) { 3994cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate int count = mCount.get(); 4004cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(count); 401617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 402617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 403617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void readSummaryFromParcelLocked(Parcel in) { 4044cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mLoadedCount = in.readInt(); 4054cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mLoadedCount); 4063bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 4074cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount = mLoadedCount; 408617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 409617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 410e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 411e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class SamplingCounter extends Counter { 412e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 413e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) { 414e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables, in); 415e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 416e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 417e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables) { 418e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables); 419e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 420e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 4214cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void addCountAtomic(long count) { 4224cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.addAndGet((int)count); 423e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 424e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 425e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for keeping track of timing information. 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 429c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static abstract class Timer extends BatteryStats.Timer implements Unpluggable { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mType; 4316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn final ArrayList<Unpluggable> mUnpluggables; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedCount; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastCount; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedCount; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Times are in microseconds for better accuracy when dividing by the 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock count, and are in "battery realtime" units. 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we have accumulated since the start of the original 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * boot, to the last time something interesting happened in the 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current run. 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTotalTime; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we loaded for the previous runs. Subtract this from 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mTotalTime to find the time for the current run of the system. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTime; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The run time of the last run of the system, as loaded from the 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved data. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastTime; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value of mTotalTime when unplug() was last called. Subtract 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this from mTotalTime to find the time since the last unplug from 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * power. 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedTime; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 467244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani /** 468244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * Constructs from a parcel. 469244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param type 470244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param unpluggables 471244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param powerType 472244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param in 473244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani */ 474c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 4766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount = in.readInt(); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedCount = in.readInt(); 4803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = in.readInt(); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = in.readLong(); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTime = in.readLong(); 4843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastTime = 0; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = in.readLong(); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables) { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 4916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 495c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract long computeRunTimeLocked(long curBatteryRealtime); 496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 497c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract int computeCurrentCountLocked(); 498c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 4996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 5006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear state of this timer. Returns true if the timer is inactive 5016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * so can be completely dropped. 5026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 5039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 5046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalTime = mLoadedTime = mLastTime = 0; 5056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCount = mLoadedCount = mLastCount = 0; 5066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (detachIfReset) { 5076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn detach(); 5086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 5106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 5126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 5136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 5146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, long batteryRealtime) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mCount); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedCount); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedCount); 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRunTimeLocked(batteryRealtime)); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTime); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedTime); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedTime=" + mUnpluggedTime 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedCount=" + mUnpluggedCount); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = computeRunTimeLocked(batteryRealtime); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = mCount; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": new mUnpluggedTime=" + mUnpluggedTime 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new mUnpluggedCount=" + mUnpluggedCount); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime 543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " old mTotalTime=" + mTotalTime); 544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = computeRunTimeLocked(batteryRealtime); 546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = computeCurrentCountLocked(); 547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType 549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + ": new mTotalTime=" + mTotalTime); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a possibly null Timer to a Parcel. 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer, or null. 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void writeTimerToParcel(Parcel out, Timer timer, 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer == null) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); // indicates null 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); // indicates non-null 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timer.writeToParcel(out, batteryRealtime); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long getTotalTimeLocked(long batteryRealtime, int which) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastTime; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = computeRunTimeLocked(batteryRealtime); 5776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedTime; 5796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedTime; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastCount; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar val = computeCurrentCountLocked(); 5946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedCount; 5966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedCount; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 604627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void logState(Printer pw, String prefix) { 605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + " mCount=" + mCount 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedCount=" + mUnpluggedCount); 608627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mTotalTime=" + mTotalTime 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedTime=" + mLoadedTime); 610627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mLastTime=" + mLastTime 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedTime=" + mUnpluggedTime); 612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long runTime = computeRunTimeLocked(batteryRealtime); 617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Divide by 1000 for backwards compatibility 618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong((runTime + 500) / 1000); 619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount); 620c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 623c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Multiply by 1000 for backwards compatibility 624c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = mLoadedTime = in.readLong() * 1000; 6253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastTime = 0; 626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedTime = mTotalTime; 627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = mLoadedCount = in.readInt(); 6283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedCount = mCount; 630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class SamplingTimer extends Timer { 634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported count from /proc/wakelocks. 637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mCurrentReportedCount; 639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported count from /proc/wakelocks when unplug() was last 642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUnpluggedReportedCount; 645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported total_time from /proc/wakelocks. 648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mCurrentReportedTotalTime; 650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported total_time from /proc/wakelocks when unplug() was last 654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUnpluggedReportedTotalTime; 657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently in a discharge cycle. 660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mInDischarge; 662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently recording reported values. 665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mTrackingReportedValues; 667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * A sequnce counter, incremented once for each update of the stats. 670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUpdateVersion; 672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) { 674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables, in); 675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = in.readInt(); 676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = in.readInt(); 677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = in.readLong(); 678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = in.readLong(); 679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, 684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean trackReportedValues) { 685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables); 686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = trackReportedValues; 687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setStale() { 691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = false; 692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = 0; 693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = 0; 694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setUpdateVersion(int version) { 697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateVersion = version; 698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getUpdateVersion() { 701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUpdateVersion; 702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedCount(int count) { 705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedCount == 0) { 706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = count; 708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 710c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 711c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = count; 712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedTotalTime(long totalTime) { 715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedTotalTime == 0) { 716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = totalTime; 718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = totalTime; 722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 723c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 724c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void unplug(long batteryUptime, long batteryRealtime) { 725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.unplug(batteryUptime, batteryRealtime); 726c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mTrackingReportedValues) { 727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime; 728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount; 729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = true; 731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = false; 736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount 741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedCount=" + mUnpluggedReportedCount 742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime 743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime); 744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mTotalTime + (mInDischarge && mTrackingReportedValues 748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0); 749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 750c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 751c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 752c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount + (mInDischarge && mTrackingReportedValues 753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedCount - mUnpluggedReportedCount : 0); 754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mUnpluggedReportedCount); 760c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUnpluggedReportedTotalTime); 762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 764c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 7659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 7669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.reset(stats, detachIfReset); 7676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn setStale(); 7686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 7696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 7706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeSummaryFromParcelLocked(out, batteryRealtime); 773c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 775c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong(); 781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount = in.readInt(); 782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * State for keeping track of timing information. 788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class StopwatchTimer extends Timer { 7900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final Uid mUid; 791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mTimerPool; 7920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 793c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mNesting; 794c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The last time at which we updated the timer. If mNesting is > 0, 797c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * subtract this from the current battery time to find the amount of 798c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * time we have been running since we last computed an update. 799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUpdateTime; 801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 8039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn * The total time at which the timer was acquired, to determine if it 804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * was actually held for an interesting duration. 805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mAcquireTime; 807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 808f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long mTimeout; 809f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 8100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn /** 8110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn * For partial wake locks, keep track of whether we are in the list 8120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn * to consume CPU cycles. 8130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn */ 8140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn boolean mInList; 8150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 8160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool, 817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables, Parcel in) { 818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables, in); 8190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mUid = uid; 820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = in.readLong(); 822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 8240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool, 825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables) { 826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables); 8270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mUid = uid; 828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 831f37447bad3773b62176baa837908daf6edb44273Amith Yamasani void setTimeout(long timeout) { 832f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mTimeout = timeout; 833f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 834f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUpdateTime); 838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mNesting > 0) { 842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "old mUpdateTime=" + mUpdateTime); 844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = batteryRealtime; 847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "new mUpdateTime=" + mUpdateTime); 849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startRunningLocked(BatteryStatsImpl stats) { 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting++ == 0) { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUpdateTime = stats.getBatteryRealtimeLocked( 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.elapsedRealtime() * 1000); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all currently active timers before adding 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this new one to the pool. 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add this timer to the active pool 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.add(this); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Increment the count 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount++; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAcquireTime = mTotalTime; 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 88132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani boolean isRunningLocked() { 88232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return mNesting > 0; 88332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 88432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopRunningLocked(BatteryStatsImpl stats) { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore attempt to stop a timer that isn't running 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting == 0) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (--mNesting == 0) { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all active counters, scaled by the total 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // active in the pool, before taking this one out of the pool. 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove this timer from the active pool 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.remove(this); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long realtime = SystemClock.elapsedRealtime() * 1000; 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 1; 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = computeRunTimeLocked(batteryRealtime); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTotalTime == mAcquireTime) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there was no change in the time, then discard this 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // count. A somewhat cheezy strategy, but hey. 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount--; 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update the total time for all other running Timers with the same type as this Timer 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // due to a change in timer count 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void refreshTimersLocked(final BatteryStatsImpl stats, 922c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> pool) { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long realtime = SystemClock.elapsedRealtime() * 1000; 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = pool.size(); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>= 0; i--) { 927c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer t = pool.get(i); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long heldTime = batteryRealtime - t.mUpdateTime; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (heldTime > 0) { 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mTotalTime += heldTime / N; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mUpdateTime = batteryRealtime; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 936c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 937c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 938f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) { 939f37447bad3773b62176baa837908daf6edb44273Amith Yamasani curBatteryRealtime = mUpdateTime + mTimeout; 940f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTotalTime + (mNesting > 0 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (curBatteryRealtime - mUpdateTime) 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project / (mTimerPool != null ? mTimerPool.size() : 1) 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : 0); 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 947c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 948c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 949c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount; 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 9536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean canDetach = mNesting <= 0; 9549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.reset(stats, canDetach && detachIfReset); 9559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mNesting > 0) { 9569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mUpdateTime = stats.getBatteryRealtimeLocked( 9579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn SystemClock.elapsedRealtime() * 1000); 9589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 9599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mAcquireTime = mTotalTime; 9606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return canDetach; 9616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 9626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 9636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 9646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn super.detach(); 9656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPool != null) { 9666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPool.remove(this); 9676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 9686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 9696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readSummaryFromParcelLocked(Parcel in) { 971c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 976c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> readKernelWakelockStats() { 977c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 978c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] buffer = new byte[4096]; 979c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int len; 980c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 981c64edde69d18498fb2954f71a546357b07ab996aEvan Millar try { 982c64edde69d18498fb2954f71a546357b07ab996aEvan Millar FileInputStream is = new FileInputStream("/proc/wakelocks"); 983c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = is.read(buffer); 984c64edde69d18498fb2954f71a546357b07ab996aEvan Millar is.close(); 985c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 986c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (len > 0) { 987c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 988c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i=0; i<len; i++) { 989c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (buffer[i] == '\0') { 990c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = i; 991c64edde69d18498fb2954f71a546357b07ab996aEvan Millar break; 992c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 993c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 994c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 995c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.FileNotFoundException e) { 996c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 997c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.IOException e) { 998c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 999c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1000c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1001c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return parseProcWakelocks(buffer, len); 1002c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1003c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1004c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> parseProcWakelocks( 1005c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] wlBuffer, int len) { 1006c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name; 1007c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count; 1008c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long totalTime; 1009c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int startIndex, endIndex; 1010c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int numUpdatedWlNames = 0; 1011c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Advance past the first line. 1013c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 1014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++); 1015c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex = i + 1; 1016c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1017c64edde69d18498fb2954f71a546357b07ab996aEvan Millar synchronized(this) { 1018c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = mProcWakelockFileStats; 1019c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1020c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion++; 1021c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (endIndex < len) { 1022c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (endIndex=startIndex; 1023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0'; 1024c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex++); 1025e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani // Don't go over the end of the buffer 1026e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani if (endIndex < len) { 1027e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani endIndex++; // endIndex is an exclusive upper bound. 1028e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani } 1029c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String[] nameStringArray = mProcWakelocksName; 1031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long[] wlData = mProcWakelocksData; 10322098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // Stomp out any bad characters since this is from a circular buffer 10332098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // A corruption is seen sometimes that results in the vm crashing 10342098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // This should prevent crashes and the line will probably fail to parse 10352098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani for (int j = startIndex; j < endIndex; j++) { 10362098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?'; 10372098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani } 103853b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex, 103953b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null); 10402098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani 1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar name = nameStringArray[0]; 1042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar count = (int) wlData[1]; 1043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // convert nanoseconds to microseconds with rounding. 1044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar totalTime = (wlData[2] + 500) / 1000; 1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 104653b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani if (parsed && name.length() > 0) { 1047c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (!m.containsKey(name)) { 1048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar m.put(name, new KernelWakelockStats(count, totalTime, 1049c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion)); 1050c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 1051c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 1052c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kwlStats = m.get(name); 1053c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlStats.mVersion == sKernelWakelockUpdateVersion) { 1054c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount += count; 1055c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime += totalTime; 1056c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 1057c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount = count; 1058c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime = totalTime; 1059c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mVersion = sKernelWakelockUpdateVersion; 1060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 1061c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 106353b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani } 1064c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex; 1065c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1066c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1067c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != numUpdatedWlNames) { 1068c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Don't report old data. 1069c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Iterator<KernelWakelockStats> itr = m.values().iterator(); 1070c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (itr.hasNext()) { 1071c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (itr.next().mVersion != sKernelWakelockUpdateVersion) { 1072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar itr.remove(); 1073c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1074c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1075c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1076c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return m; 1077c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1078c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1079c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1080c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private class KernelWakelockStats { 1081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mCount; 1082c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long mTotalTime; 1083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mVersion; 1084c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1085c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats(int count, long totalTime, int version) { 1086c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = count; 1087c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = totalTime; 1088c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mVersion = version; 1089c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1090c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 1093c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Get the KernelWakelockTimer associated with name, and create a new one if one 1094c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * doesn't already exist. 1095c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 1096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public SamplingTimer getKernelWakelockTimerLocked(String name) { 1097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 1098c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 1099c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 1100c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 1101c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 1102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return kwlt; 1104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 11053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataPlug(long[] dataTransfer, long currentBytes) { 11076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_LAST] = dataTransfer[STATS_SINCE_UNPLUGGED]; 11086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_SINCE_UNPLUGGED] = -1; 11093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataUnplug(long[] dataTransfer, long currentBytes) { 11126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_SINCE_UNPLUGGED] = currentBytes; 11133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11153f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 11163f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Radio uptime in microseconds when transferring data. This value is very approximate. 11173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @return 11183f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 11193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private long getCurrentRadioDataUptime() { 11203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani try { 11213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms"); 11223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (!awakeTimeFile.exists()) return 0; 11233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile)); 11243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani String line = br.readLine(); 11253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani br.close(); 11263f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return Long.parseLong(line) * 1000; 11273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (NumberFormatException nfe) { 11283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 11293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (IOException ioe) { 11303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 11313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11323718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return 0; 11333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 11363f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @deprecated use getRadioDataUptime 11373f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 11383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getRadioDataUptimeMs() { 11393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getRadioDataUptime() / 1000; 11403f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11413f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 11423f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 11433f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Returns the duration that the cell radio was up for data transfers. 11443f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 11453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public long getRadioDataUptime() { 11463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (mRadioDataStart == -1) { 11473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return mRadioDataUptime; 11483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 11493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentRadioDataUptime() - mRadioDataStart; 11503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 11523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int getCurrentBluetoothPingCount() { 11543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBtHeadset != null) { 11553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return mBtHeadset.getBatteryUsageHint(); 11563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11573f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return -1; 11583f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11593f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 11603f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public int getBluetoothPingCount() { 11613f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBluetoothPingStart == -1) { 11623f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return mBluetoothPingCount; 11633f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } else if (mBtHeadset != null) { 11643f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentBluetoothPingCount() - mBluetoothPingStart; 11653f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 116682cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani return 0; 11673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 11693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public void setBtHeadset(BluetoothHeadset headset) { 117082cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) { 117182cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 117282cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani } 11733f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBtHeadset = headset; 11743f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 11753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 1176f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn int mChangedStates = 0; 1177f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 11786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(long curTime) { 11796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mHaveBatteryLevel || !mRecordingHistory) { 11806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 11816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 11829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 11839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // If the current time is basically the same as the last time, 1184f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // and no states have since the last recorded entry changed and 1185f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // are now resetting back to their original value, then just collapse 1186f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // into one record. 11879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE 1188f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+2000) 1189f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn && ((mHistoryEnd.states^mHistoryCur.states)&mChangedStates) == 0) { 11909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // If the current is the same as the one before, then we no 11919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // longer need the entry. 11929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE 11939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && mHistoryLastEnd.same(mHistoryCur)) { 11949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd.next = null; 11959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd.next = mHistoryCache; 11969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCache = mHistoryEnd; 11979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd = mHistoryLastEnd; 11989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd = null; 11999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } else { 1200f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn mChangedStates |= mHistoryEnd.states^mHistoryCur.states; 12019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, mHistoryCur); 12029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 12039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return; 12049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 12059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1206f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn mChangedStates = 0; 1207f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 1208f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn if (mNumHistoryItems == MAX_HISTORY_ITEMS 1209f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) { 12107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn addHistoryRecordLocked(curTime, HistoryItem.CMD_OVERFLOW); 12117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 12127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 12136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mNumHistoryItems >= MAX_HISTORY_ITEMS) { 12146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // Once we've reached the maximum number of items, we only 1215f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // record changes to the battery level and the most interesting states. 1216f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // Once we've reached the maximum maximum number of items, we only 12176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // record changes to the battery level. 12186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryEnd != null && mHistoryEnd.batteryLevel 1219f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn == mHistoryCur.batteryLevel && 1220f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS 1221f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn || ((mHistoryEnd.states^mHistoryCur.states) 1222f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn & HistoryItem.MOST_INTERESTING_STATES) == 0)) { 12236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 12246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 12256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 12269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 12276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE); 12286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 12296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 12306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(long curTime, byte cmd) { 12316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem rec = mHistoryCache; 123232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec != null) { 123332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCache = rec.next; 123432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 12356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn rec = new HistoryItem(); 123632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 12376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur); 12386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 12396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(rec); 124032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 124132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 12426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(HistoryItem rec) { 12436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mNumHistoryItems++; 124432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec.next = null; 12459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd = mHistoryEnd; 124632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mHistoryEnd != null) { 124732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd.next = rec; 124832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd = rec; 124932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 125032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistory = mHistoryEnd = rec; 125132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 125232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 125332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 12546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void clearHistoryLocked() { 125532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mHistory != null) { 125632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd.next = mHistoryCache; 125732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCache = mHistory; 12589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistory = mHistoryLastEnd = mHistoryEnd = null; 125932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 12606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mNumHistoryItems = 0; 12616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryBaseTime = 0; 126232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 126332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 12646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void doUnplugLocked(long batteryUptime, long batteryRealtime) { 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 12671719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff u.mStartedTcpBytesReceived = TrafficStats.getUidRxBytes(u.mUid); 12681719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff u.mStartedTcpBytesSent = TrafficStats.getUidTxBytes(u.mUid); 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived; 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent; 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track total mobile data 12761719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mMobileDataRx, TrafficStats.getMobileRxBytes()); 12771719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mMobileDataTx, TrafficStats.getMobileTxBytes()); 12781719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mTotalDataRx, TrafficStats.getTotalRxBytes()); 12791719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mTotalDataTx, TrafficStats.getTotalTxBytes()); 12803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 12813f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataStart = getCurrentRadioDataUptime(); 12823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = 0; 12833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 12843f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 12853f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = 0; 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 12886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void doPlugLocked(long batteryUptime, long batteryRealtime) { 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesReceived >= 0) { 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived(); 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesReceived = -1; 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesSent >= 0) { 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent(); 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesSent = -1; 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).plug(batteryUptime, batteryRealtime); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13031719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mMobileDataRx, TrafficStats.getMobileRxBytes()); 13041719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mMobileDataTx, TrafficStats.getMobileTxBytes()); 13051719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mTotalDataRx, TrafficStats.getTotalRxBytes()); 13061719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mTotalDataTx, TrafficStats.getTotalTxBytes()); 13073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 13083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataUptime = getRadioDataUptime(); 13093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 13103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 13113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 13123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = getBluetoothPingCount(); 13133f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 13169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn int mWakeLockNesting; 13179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 13189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartWakeLocked(int uid, int pid, String name, int type) { 13191ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (type == WAKE_TYPE_PARTIAL) { 13201ebccf531d1049853b3b0630035434619682c016Dianne Hackborn // Only care about partial wake locks, since full wake locks 13211ebccf531d1049853b3b0630035434619682c016Dianne Hackborn // will be canceled when the user puts the screen to sleep. 13221ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWakeLockNesting == 0) { 13231ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG; 13241ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: " 13251ebccf531d1049853b3b0630035434619682c016Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 13261ebccf531d1049853b3b0630035434619682c016Dianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 13271ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 13281ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mWakeLockNesting++; 13299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (uid >= 0) { 13310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { 13320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); 13330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); 13340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 13359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type); 13369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 13399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopWakeLocked(int uid, int pid, String name, int type) { 13401ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (type == WAKE_TYPE_PARTIAL) { 13411ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mWakeLockNesting--; 13421ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWakeLockNesting == 0) { 13431ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG; 13441ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: " 13451ebccf531d1049853b3b0630035434619682c016Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 13461ebccf531d1049853b3b0630035434619682c016Dianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 13471ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 13489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (uid >= 0) { 13500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { 13510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); 13520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); 13530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 13549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type); 13559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 13579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 13587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) { 13597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 13607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 13617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteStartWakeLocked(ws.get(i), pid, name, type); 13627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 13637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 13647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 13657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) { 13667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 13677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 13687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteStopWakeLocked(ws.get(i), pid, name, type); 13697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 13707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 13717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 13720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public int startAddingCpuLocked() { 13730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.removeMessages(MSG_UPDATE_WAKELOCKS); 13740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 13750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (mScreenOn) { 13760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 13770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 13780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 13790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int N = mPartialTimers.size(); 13800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (N == 0) { 13810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.clear(); 13820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 13830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 13840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 13850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // How many timers should consume CPU? Only want to include ones 13860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // that have already been in the list. 13870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 13880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 13890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 13900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 13910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // We don't include the system UID, because it so often 13920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // holds wake locks at one request or another of an app. 13930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 13940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 50; 13950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 13960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 13970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 13980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 13990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 14000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 14020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void finishAddingCpuLocked(int perc, int utime, int stime, long[] cpuSpeedTimes) { 14030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int N = mPartialTimers.size(); 14040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (perc != 0) { 14050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn int num = 0; 14060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 14070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 14080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 14090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 14100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // We don't include the system UID, because it so often 14110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // holds wake locks at one request or another of an app. 14120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 14130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn num++; 14140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (num != 0) { 14180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 14190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 14200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 14210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 14220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 1423618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn int myUTime = utime/num; 1424618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn int mySTime = stime/num; 1425618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn utime -= myUTime; 1426618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn stime -= mySTime; 1427618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn num--; 14280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*"); 14290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addCpuTimeLocked(myUTime, mySTime); 14300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addSpeedStepTimes(cpuSpeedTimes); 14310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 14360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // Just in case, collect any lost CPU time. 14370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (utime != 0 || stime != 0) { 14380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = getUidStatsLocked(Process.SYSTEM_UID); 14390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null) { 14400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid.Proc proc = uid.getProcessStatsLocked("*lost*"); 14410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addCpuTimeLocked(utime, stime); 14420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addSpeedStepTimes(cpuSpeedTimes); 14430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 14470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int NL = mLastPartialTimers.size(); 14480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn boolean diff = N != NL; 14490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL && !diff; i++) { 14500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i); 14510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!diff) { 14530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL; i++) { 14540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPartialTimers.get(i).mInList = true; 14550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return; 14570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 14590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL; i++) { 14600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.get(i).mInList = false; 14610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.clear(); 14630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 14640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 14650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn st.mInList = true; 14660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.add(st); 14670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 14690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 14709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteProcessDiedLocked(int uid, int pid) { 14719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 14729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 14739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn u.mPids.remove(pid); 14749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 14779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public long getProcessWakeTime(int uid, int pid, long realtime) { 14789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 14799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 14809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid.Pid p = u.mPids.get(pid); 14819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p != null) { 14829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return p.mWakeSum + (p.mWakeStart != 0 ? (realtime - p.mWakeStart) : 0); 14839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return 0; 14869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 14889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) { 14899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 14909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 14919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn u.reportExcessiveWakeLocked(proc, overTime, usedTime); 14929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1495287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) { 1496287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Uid u = mUidStats.get(uid); 1497287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (u != null) { 1498287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn u.reportExcessiveCpuLocked(proc, overTime, usedTime); 1499287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1500287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1501287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 15029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn int mSensorNesting; 15039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 15049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartSensorLocked(int uid, int sensor) { 15059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mSensorNesting == 0) { 15069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG; 15079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: " 15089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 15099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 15109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mSensorNesting++; 15129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStartSensor(sensor); 15139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 15159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopSensorLocked(int uid, int sensor) { 15169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mSensorNesting--; 15179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mSensorNesting == 0) { 15189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG; 15199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: " 15209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 15219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 15229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStopSensor(sensor); 15249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 152632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mGpsNesting; 152732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 15286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteStartGpsLocked(int uid) { 152932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 15306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG; 153132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: " 153232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 15336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 153432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 153532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting++; 15362e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStartGps(); 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteStopGpsLocked(int uid) { 154032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting--; 154132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 15426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG; 154332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: " 154432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 15456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 154632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 15472e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStopGps(); 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOnLocked() { 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mScreenOn) { 15526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG; 155332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " 155432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 15556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = true; 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.startRunningLocked(this); 1558617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1559617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this); 1560617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 15619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 15629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // Fake a wake lock, so we consider the device waked as long 15639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // as the screen is on. 15641ebccf531d1049853b3b0630035434619682c016Dianne Hackborn noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOffLocked() { 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mScreenOn) { 15706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG; 157132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: " 157232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 15736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.stopRunningLocked(this); 1576617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1577617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1578617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 15799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 15801ebccf531d1049853b3b0630035434619682c016Dianne Hackborn noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); 1581617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1582617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1583617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1584617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightnessLocked(int brightness) { 1585617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Bin the brightness. 1586617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS); 1587617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (bin < 0) bin = 0; 1588617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1; 1589617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin != bin) { 15906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK) 15916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT); 159232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: " 159332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 15946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenOn) { 1596617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1597617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1598617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1599617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[bin].startRunningLocked(this); 1600617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1601617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessBin = bin; 1602617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1603617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1604617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 16054cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void noteInputEventAtomic() { 16064cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mInputEventCounter.stepAtomic(); 1607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1608617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int uid, int event) { 16102e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteUserActivityLocked(event); 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOnLocked() { 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPhoneOn) { 16153bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG; 161632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: " 161732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = true; 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.startRunningLocked(this); 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOffLocked() { 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPhoneOn) { 16263bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG; 162732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: " 162832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.stopRunningLocked(this); 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 163432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 16353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn void stopAllSignalStrengthTimersLocked(int except) { 16363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) { 16373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (i == except) { 16383bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn continue; 16393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 16403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) { 16413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mPhoneSignalStrengthsTimer[i].stopRunningLocked(this); 16423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 16433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 16443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 16453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 1646f37447bad3773b62176baa837908daf6edb44273Amith Yamasani /** 1647f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * Telephony stack updates the phone state. 1648f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * @param state phone state from ServiceState.getState() 1649f37447bad3773b62176baa837908daf6edb44273Amith Yamasani */ 1650f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneStateLocked(int state) { 16513bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn boolean scanning = false; 16523bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 1653f37447bad3773b62176baa837908daf6edb44273Amith Yamasani int bin = mPhoneSignalStrengthBin; 16543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 16553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If the phone is powered off, stop all timers. 16563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (state == ServiceState.STATE_POWER_OFF) { 16573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn stopAllSignalStrengthTimersLocked(-1); 1658f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 1659f37447bad3773b62176baa837908daf6edb44273Amith Yamasani // If we're back in service or continuing in service, restart the old timer. 16603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } if (state == ServiceState.STATE_IN_SERVICE) { 1661f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (bin == -1) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1662f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) { 1663f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 1664f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 16653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 16663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If we're out of service, we are in the lowest signal strength 16673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // bin and have the scanning bit set. 1668f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } else if (state == ServiceState.STATE_OUT_OF_SERVICE) { 16693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn scanning = true; 1670f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalStrengthBin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 16713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn stopAllSignalStrengthTimersLocked(mPhoneSignalStrengthBin); 1672f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (!mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].isRunningLocked()) { 1673f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].startRunningLocked(this); 1674f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1675f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (!mPhoneSignalScanningTimer.isRunningLocked()) { 16766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG; 16776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: " 16786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1680f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.startRunningLocked(this); 1681f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1682f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 168332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 16843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (!scanning) { 16853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If we are no longer scanning, then stop the scanning timer. 16863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (mPhoneSignalScanningTimer.isRunningLocked()) { 16873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG; 16883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: " 16893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mPhoneSignalScanningTimer.stopRunningLocked(this); 16923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 16933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 16943bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 169532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mPhoneServiceState != state) { 16966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK) 16976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (state << HistoryItem.STATE_PHONE_STATE_SHIFT); 169832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + bin + " to: " 169932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 17006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 170132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mPhoneServiceState = state; 170232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 170332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 170432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 1705e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) { 1706627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Bin the strength. 1707627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin; 1708f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mPhoneServiceState == ServiceState.STATE_POWER_OFF 1709f37447bad3773b62176baa837908daf6edb44273Amith Yamasani || mPhoneServiceState == ServiceState.STATE_OUT_OF_SERVICE) { 1710f37447bad3773b62176baa837908daf6edb44273Amith Yamasani // Ignore any signal strength changes when radio was turned off or out of service. 1711f37447bad3773b62176baa837908daf6edb44273Amith Yamasani return; 1712f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1713e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (!signalStrength.isGsm()) { 1714e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int dBm = signalStrength.getCdmaDbm(); 1715f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (dBm >= -75) bin = SIGNAL_STRENGTH_GREAT; 1716f37447bad3773b62176baa837908daf6edb44273Amith Yamasani else if (dBm >= -85) bin = SIGNAL_STRENGTH_GOOD; 1717f37447bad3773b62176baa837908daf6edb44273Amith Yamasani else if (dBm >= -95) bin = SIGNAL_STRENGTH_MODERATE; 1718f37447bad3773b62176baa837908daf6edb44273Amith Yamasani else if (dBm >= -100) bin = SIGNAL_STRENGTH_POOR; 1719f37447bad3773b62176baa837908daf6edb44273Amith Yamasani else bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1720e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } else { 1721e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int asu = signalStrength.getGsmSignalStrength(); 1722e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1723e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT; 1724e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 8) bin = SIGNAL_STRENGTH_GOOD; 1725e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 4) bin = SIGNAL_STRENGTH_MODERATE; 1726e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else bin = SIGNAL_STRENGTH_POOR; 1727e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1728627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneSignalStrengthBin != bin) { 17296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_SIGNAL_STRENGTH_MASK) 17306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (bin << HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT); 173132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: " 173232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 17336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1734627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneSignalStrengthBin >= 0) { 1735627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this); 1736627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1737627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthBin = bin; 1738627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 1739627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1740627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1741627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1742627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) { 1743627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin = DATA_CONNECTION_NONE; 1744627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (hasData) { 1745627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn switch (dataType) { 1746627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_EDGE: 1747627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_EDGE; 1748627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1749627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_GPRS: 1750627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_GPRS; 1751627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1752627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_UMTS: 1753627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_UMTS; 1754627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 17556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_CDMA: 17566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_CDMA; 17576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 17586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_0: 17596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_0; 17606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 17616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_A: 17626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_A; 17636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 17646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_1xRTT: 17656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_1xRTT; 17666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 17676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSDPA: 17686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSDPA; 17696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 17706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSUPA: 17716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSUPA; 17726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 17736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSPA: 17746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSPA; 17756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 17766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_IDEN: 17776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_IDEN; 17786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 17796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_B: 17806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_B; 17816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 1782627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn default: 1783627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_OTHER; 1784627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1785627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1786627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 17873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData); 1788627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType != bin) { 17896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK) 17906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT); 179132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: " 179232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 17936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1794627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType >= 0) { 1795627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this); 1796627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1797627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionType = bin; 1798627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[bin].startRunningLocked(this); 1799627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1800627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1801627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 180258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOnLocked() { 1803105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mWifiOn) { 18046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG; 180532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: " 180632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = true; 1809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.startRunningLocked(this); 1810105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1811105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 181358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOffLocked() { 1814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mWifiOn) { 18156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG; 181632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: " 181732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1819105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 1820105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.stopRunningLocked(this); 1821105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1822617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 182358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked(); 1824617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = -1; 1825617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1826105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1827244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1828244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOnLocked(int uid) { 1829244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioOn) { 18306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG; 183132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: " 183232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1834244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = true; 1835244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.startRunningLocked(this); 1836244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 18372e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOnLocked(); 1838244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1840244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOffLocked(int uid) { 1841244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioOn) { 18426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; 184332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " 184432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1846244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = false; 1847244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.stopRunningLocked(this); 1848244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 18492e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOffLocked(); 1850244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1851244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1852244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOnLocked(int uid) { 1853244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoOn) { 18546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG; 185532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: " 185632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1858244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = true; 1859244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.startRunningLocked(this); 1860244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 18612e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOnLocked(); 1862244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1863244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1864244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOffLocked(int uid) { 1865244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoOn) { 18666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG; 186732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " 186832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1870244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = false; 1871244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.stopRunningLocked(this); 1872244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 18732e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOffLocked(); 1874244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1875244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 187658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningLocked(WorkSource ws) { 187758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (!mGlobalWifiRunning) { 18786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG; 187932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: " 188032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 188258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = true; 188358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.startRunningLocked(this); 188458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = ws.size(); 188558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 188658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(ws.get(i)).noteWifiRunningLocked(); 188758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 188858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 188958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running"); 1890d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1891d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1892d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 189358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) { 189458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mGlobalWifiRunning) { 189558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = oldWs.size(); 189658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 189758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked(); 189858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 189958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn N = newWs.size(); 190058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 190158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked(); 190258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 190358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 190458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running"); 190558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 190658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 190758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 190858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStoppedLocked(WorkSource ws) { 190958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mGlobalWifiRunning) { 19106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RUNNING_FLAG; 191132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: " 191232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 191458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 191558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.stopRunningLocked(this); 191658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = ws.size(); 191758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 191858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked(); 191958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 192058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 192158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running"); 1922d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1923d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1924d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1925105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOnLocked() { 1926105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mBluetoothOn) { 19276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG; 192832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: " 192932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1931105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = true; 1932105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.startRunningLocked(this); 1933105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1934105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1935105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1936105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOffLocked() { 1937105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mBluetoothOn) { 19386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG; 193932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: " 194032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1942105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 1943105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.stopRunningLocked(this); 1944105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1945105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1946105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 194732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiFullLockNesting = 0; 194832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 1949105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked(int uid) { 195032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 19516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; 195232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: " 195332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 195532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 195632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting++; 19572e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked(); 1958105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1959105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1960105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked(int uid) { 196132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting--; 196232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 19636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; 196432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: " 196532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 196732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 19682e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockReleasedLocked(); 1969105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1970105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 197132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiScanLockNesting = 0; 197232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 1973105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked(int uid) { 197432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiScanLockNesting == 0) { 19756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG; 197632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: " 197732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 197932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 198032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiScanLockNesting++; 19812e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked(); 1982105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1983105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1984105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked(int uid) { 198532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiScanLockNesting--; 198632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiScanLockNesting == 0) { 19876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG; 198832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: " 198932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 199132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 19922e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockReleasedLocked(); 1993105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 19945347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 199532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiMulticastNesting = 0; 199632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 19975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked(int uid) { 199832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 19996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; 200032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: " 200132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 200332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 200432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting++; 20052e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastEnabledLocked(); 20065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 20075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 20085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked(int uid) { 200932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting--; 201032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 20116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; 201232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: " 201332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 20146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 201532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 20162e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastDisabledLocked(); 20175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 20185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 20197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) { 20207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 20217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 20227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteFullWifiLockAcquiredLocked(ws.get(i)); 20237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 20267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) { 20277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 20287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 20297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteFullWifiLockReleasedLocked(ws.get(i)); 20307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 20337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteScanWifiLockAcquiredFromSourceLocked(WorkSource ws) { 20347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 20357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 20367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteScanWifiLockAcquiredLocked(ws.get(i)); 20377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 20407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteScanWifiLockReleasedFromSourceLocked(WorkSource ws) { 20417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 20427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 20437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteScanWifiLockReleasedLocked(ws.get(i)); 20447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 20477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) { 20487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 20497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 20507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteWifiMulticastEnabledLocked(ws.get(i)); 20517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 20547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) { 20557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 20567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 20577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteWifiMulticastDisabledLocked(ws.get(i)); 20587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 20607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getScreenOnTime(long batteryRealtime, int which) { 2062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which); 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2065617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public long getScreenBrightnessTime(int brightnessBin, 2066617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long batteryRealtime, int which) { 2067c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked( 2068617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn batteryRealtime, which); 2069617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2070244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2071617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getInputEventCount(int which) { 2072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mInputEventCounter.getCountLocked(which); 2073617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2074617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getPhoneOnTime(long batteryRealtime, int which) { 2076c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which); 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2078244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2079627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneSignalStrengthTime(int strengthBin, 2080627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 2081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked( 2082627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 2083627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2084f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 2085f37447bad3773b62176baa837908daf6edb44273Amith Yamasani @Override public long getPhoneSignalScanningTime( 2086f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long batteryRealtime, int which) { 2087f37447bad3773b62176baa837908daf6edb44273Amith Yamasani return mPhoneSignalScanningTimer.getTotalTimeLocked( 2088f37447bad3773b62176baa837908daf6edb44273Amith Yamasani batteryRealtime, which); 2089f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 2090f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 2091617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneSignalStrengthCount(int dataType, int which) { 2092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 2093617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2094617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2095627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneDataConnectionTime(int dataType, 2096627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 2097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked( 2098627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 2099627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2100627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 2101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneDataConnectionCount(int dataType, int which) { 2102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 2103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2105105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getWifiOnTime(long batteryRealtime, int which) { 2106c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which); 2107105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 210958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) { 211058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 2111d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2112d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 2113105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getBluetoothOnTime(long batteryRealtime, int which) { 2114c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which); 2115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2116105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean getIsOnBattery() { 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() { 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUidStats; 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular uid. 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Uid extends BatteryStats.Uid { 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mUid; 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesReceived; 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesSent; 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesReceived; 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesSent; 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesReceivedAtLastUnplug; 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesSentAtLastUnplug; 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are not saved/restored when parcelling, since we want 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to return from the parcel with a snapshot of the state. 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesReceived = -1; 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesSent = -1; 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 214358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn boolean mWifiRunning; 214458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn StopwatchTimer mWifiRunningTimer; 2145617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2146105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mFullWifiLockOut; 2147c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mFullWifiLockTimer; 2148105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2149105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mScanWifiLockOut; 2150c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScanWifiLockTimer; 2151244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 21525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt boolean mWifiMulticastEnabled; 21535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt StopwatchTimer mWifiMulticastTimer; 2154244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2155244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioTurnedOn; 2156244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioTurnedOnTimer; 2157244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2158244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoTurnedOn; 2159244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoTurnedOnTimer; 21605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2161617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter[] mUserActivityCounters; 2162617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's wake locks. 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>(); 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's sensor activations. 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>(); 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>(); 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>(); 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn /** 21849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn * The transient wake stats we have collected for this uid's pids. 21859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn */ 21869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn final SparseArray<Pid> mPids = new SparseArray<Pid>(); 21879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid(int uid) { 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUid = uid; 219058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 219158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables); 21920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 219358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables); 21940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK, 219558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers, mUnpluggables); 21960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 219758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables); 21980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 21990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables); 22000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 22015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt null, mUnpluggables); 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() { 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWakelockStats; 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() { 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSensorStats; 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() { 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProcessStats; 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() { 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageStats; 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2223eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2224eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getUid() { 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUid; 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2228eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2229eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesReceived(int which) { 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesReceived; 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesReceived(); 22356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesReceivedAtLastUnplug; 22376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesReceived; 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesReceived() { 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0 22461719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff ? (TrafficStats.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0); 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2248eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2249eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesSent(int which) { 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesSent; 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesSent(); 22556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesSentAtLastUnplug; 22576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesSent; 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 226558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningLocked() { 226658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (!mWifiRunning) { 226758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = true; 226858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer == null) { 226958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 227058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables); 22716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 227258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this); 2273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 227758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStoppedLocked() { 227858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunning) { 227958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = false; 228058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this); 2281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2285105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked() { 2286105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mFullWifiLockOut) { 2287105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = true; 22886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer == null) { 22890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 229058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables); 22916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2292105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 2293105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2294105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2295105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2296105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2297105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked() { 2298105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mFullWifiLockOut) { 2299105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 2300105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 2301105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2302105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2303105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2304105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2305105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked() { 2306105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mScanWifiLockOut) { 2307105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = true; 23086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer == null) { 23090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK, 231058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers, mUnpluggables); 23116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2312105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 2313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2314105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2315105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2316105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2317105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked() { 2318105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mScanWifiLockOut) { 2319105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 2320105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 2321105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2322105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 23235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 23245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 23255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked() { 23265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (!mWifiMulticastEnabled) { 23275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = true; 23286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer == null) { 23290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 233058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables); 23316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 23325347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this); 23335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 23345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 23355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 23365347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 23375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked() { 23385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (mWifiMulticastEnabled) { 23395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 23405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this); 23415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 23425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 23435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 23446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 23456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteAudioTurnedOnLocked() { 23466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mAudioTurnedOn) { 23476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = true; 23486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer == null) { 23490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 23506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables); 23516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 23526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 23536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2355244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 23566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 23576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteAudioTurnedOffLocked() { 23586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOn) { 23596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = false; 23606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 23616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 23626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 23636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 23646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 23656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteVideoTurnedOnLocked() { 23666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mVideoTurnedOn) { 23676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = true; 23686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer == null) { 23690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 23706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables); 23716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 23726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 23736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 23746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 23756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 23766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 23776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteVideoTurnedOffLocked() { 23786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOn) { 23796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = false; 23806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 23816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2382244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2383244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2384244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 238558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public long getWifiRunningTime(long batteryRealtime, int which) { 238658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer == null) { 23876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 23886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 238958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 2390244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2391244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2392105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2393105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getFullWifiLockTime(long batteryRealtime, int which) { 23946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer == null) { 23956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 23966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2397c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 2398105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2399105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2400105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2401105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getScanWifiLockTime(long batteryRealtime, int which) { 24026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer == null) { 24036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 24046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2405c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 2406105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 24095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public long getWifiMulticastTime(long batteryRealtime, int which) { 24106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer == null) { 24116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 24126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24135347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime, 24145347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt which); 24155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 24186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public long getAudioTurnedOnTime(long batteryRealtime, int which) { 24196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer == null) { 24206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 24216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 24236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 24256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 24266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public long getVideoTurnedOnTime(long batteryRealtime, int which) { 24276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer == null) { 24286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 24296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 24316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 2433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2434617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int type) { 2435617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 2436617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn initUserActivityLocked(); 2437617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2438617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (type < 0) type = 0; 2439617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1; 24404cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUserActivityCounters[type].stepAtomic(); 2441617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2442617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2443617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2444617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public boolean hasUserActivity() { 2445617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return mUserActivityCounters != null; 2446617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2447617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2448617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2449617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public int getUserActivityCount(int type, int which) { 2450617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 2451617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return 0; 2452617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2453c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUserActivityCounters[type].getCountLocked(which); 2454617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2455617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2456617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void initUserActivityLocked() { 2457617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 2458617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2459617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables); 2460617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2461617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2462617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesSent() { 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0 24651719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff ? (TrafficStats.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0); 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2467244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 24686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 24696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear all stats for this uid. Returns true if the uid is completely 24706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * inactive so can be dropped. 24716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 24726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 24736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean active = false; 24746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 247558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 247658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false); 247758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn active |= mWifiRunning; 24786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 24809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false); 24816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mFullWifiLockOut; 24826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer != null) { 24849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mScanWifiLockTimer.reset(BatteryStatsImpl.this, false); 24856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mScanWifiLockOut; 24866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 24889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false); 24896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mWifiMulticastEnabled; 24906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 24929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false); 24936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mAudioTurnedOn; 24946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 24969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false); 24976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mVideoTurnedOn; 24986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 24996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0; 25016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0; 25026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 25046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 25056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters[i].reset(false); 25066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWakelockStats.size() > 0) { 25106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator(); 25116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 25126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Wakelock> wakelockEntry = it.next(); 25136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Wakelock wl = wakelockEntry.getValue(); 25146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (wl.reset()) { 25156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn it.remove(); 25166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 25176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active = true; 25186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mSensorStats.size() > 0) { 25226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator(); 25236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 25246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<Integer, Sensor> sensorEntry = it.next(); 25256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Sensor s = sensorEntry.getValue(); 25266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (s.reset()) { 25276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn it.remove(); 25286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 25296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active = true; 25306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mProcessStats.size() > 0) { 25346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator(); 25356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 25366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Proc> procEntry = it.next(); 25376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn procEntry.getValue().detach(); 25386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mProcessStats.clear(); 25406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mPids.size() > 0) { 25429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; !active && i<mPids.size(); i++) { 25439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid pid = mPids.valueAt(i); 25449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (pid.mWakeStart != 0) { 25459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active = true; 25469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 25479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 25489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 25496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mPackageStats.size() > 0) { 25506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator(); 25516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 25526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Pkg> pkgEntry = it.next(); 25536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Pkg p = pkgEntry.getValue(); 25546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn p.detach(); 25556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (p.mServiceStats.size() > 0) { 25566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Pkg.Serv>> it2 25576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn = p.mServiceStats.entrySet().iterator(); 25586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it2.hasNext()) { 25596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Pkg.Serv> servEntry = it2.next(); 25606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn servEntry.getValue().detach(); 25616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mPackageStats.clear(); 25656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPids.clear(); 25689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 25696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!active) { 257058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 257158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.detach(); 25726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 25746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer.detach(); 25756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer != null) { 25776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mScanWifiLockTimer.detach(); 25786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 25806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer.detach(); 25816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 25836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.detach(); 25846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 25866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.detach(); 25876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 25896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 25906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters[i].detach(); 25916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return !active; 25966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 25976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakelockStats.size()); 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) { 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(wakelockEntry.getKey()); 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = wakelockEntry.getValue(); 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.writeToParcelLocked(out, batteryRealtime); 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mSensorStats.size()); 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) { 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(sensorEntry.getKey()); 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = sensorEntry.getValue(); 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.writeToParcelLocked(out, batteryRealtime); 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mProcessStats.size()); 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) { 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(procEntry.getKey()); 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = procEntry.getValue(); 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.writeToParcelLocked(out); 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mPackageStats.size()); 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) { 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(pkgEntry.getKey()); 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = pkgEntry.getValue(); 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.writeToParcelLocked(out); 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesReceived); 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesSent); 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesReceived()); 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesSent()); 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesReceivedAtLastUnplug); 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesSentAtLastUnplug); 263358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 26346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 263558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.writeToParcel(out, batteryRealtime); 26366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 2637617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 26386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 26406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 26416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer.writeToParcel(out, batteryRealtime); 2642617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 26436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 26446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mScanWifiLockTimer != null) { 26466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 26476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mScanWifiLockTimer.writeToParcel(out, batteryRealtime); 26486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 26496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 26506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 26526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 26536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer.writeToParcel(out, batteryRealtime); 26546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 26556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 26566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 26586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 26596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime); 26606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 26616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 26626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 26646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 26656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime); 26666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 26676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 26686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 2670617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 2671617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2672617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i].writeToParcel(out); 2673617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 26746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 26756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 2676617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numWakelocks = in.readInt(); 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.clear(); 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < numWakelocks; j++) { 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wakelockName = in.readString(); 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = new Wakelock(); 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.readFromParcelLocked(unpluggables, in); 26869e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) { 26879e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // We will just drop some random set of wakelocks if 26889e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // the previous run of the system was an older version 26899e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // that didn't impose a limit. 26909e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn mWakelockStats.put(wakelockName, wakelock); 26919e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numSensors = in.readInt(); 26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.clear(); 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numSensors; k++) { 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = in.readInt(); 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = new Sensor(sensorNumber); 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.readFromParcelLocked(mUnpluggables, in); 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensorNumber, sensor); 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numProcs = in.readInt(); 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.clear(); 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numProcs; k++) { 27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String processName = in.readString(); 27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = new Proc(); 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.readFromParcelLocked(in); 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(processName, proc); 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numPkgs = in.readInt(); 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.clear(); 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int l = 0; l < numPkgs; l++) { 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = in.readString(); 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = new Pkg(); 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.readFromParcelLocked(in); 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(packageName, pkg); 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesReceived = in.readLong(); 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesSent = in.readLong(); 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesReceived = in.readLong(); 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesSent = in.readLong(); 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesReceivedAtLastUnplug = in.readLong(); 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesSentAtLastUnplug = in.readLong(); 272758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = false; 27286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 272958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 273058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables, in); 27316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 273258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = null; 27336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2734105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 27356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 27360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 273758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables, in); 27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 27396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer = null; 27406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2741105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 27426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 27430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK, 274458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers, mUnpluggables, in); 27456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 27466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mScanWifiLockTimer = null; 27476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 27496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 27500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 275158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables, in); 2752617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 27536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer = null; 27546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = false; 27566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 27570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 27586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables, in); 27596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 27606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer = null; 27616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = false; 27636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 27640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 27656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables, in); 27666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 27676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer = null; 27686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 2770617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 2771617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2772617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables, in); 2773617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 27746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 27756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters = null; 2776617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular wake lock. 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Wakelock extends BatteryStats.Uid.Wakelock { 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device partially awake. 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerPartial; 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device fully awake. 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerFull; 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has had a window keeping the device awake. 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerWindow; 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a possibly null Timer from a Parcel. The timer is associated with the 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proper timer pool from the given BatteryStatsImpl object. 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in the Parcel to be read from. 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return a new Timer, or null. 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool, 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<Unpluggable> unpluggables, Parcel in) { 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return new StopwatchTimer(Uid.this, type, pool, unpluggables, in); 28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 28156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean wlactive = false; 28166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerFull != null) { 28179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false); 28186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPartial != null) { 28209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false); 28216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerWindow != null) { 28239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false); 28246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!wlactive) { 28266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerFull != null) { 28276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerFull.detach(); 28286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerFull = null; 28296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPartial != null) { 28316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPartial.detach(); 28326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPartial = null; 28336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerWindow != null) { 28356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerWindow.detach(); 28366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerWindow = null; 28376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return !wlactive; 28406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers, unpluggables, in); 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers, unpluggables, in); 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers, unpluggables, in); 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime); 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime); 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime); 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getWakeTime(int type) { 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: return mTimerFull; 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: return mTimerPartial; 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: return mTimerWindow; 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: throw new IllegalArgumentException("type = " + type); 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Sensor extends BatteryStats.Uid.Sensor { 28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mHandle; 2870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimer; 28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Sensor(int handle) { 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandle = handle; 28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables, 28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in) { 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle); 28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool == null) { 2884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pool = new ArrayList<StopwatchTimer>(); 28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(mHandle, pool); 28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in); 28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 28919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mTimer.reset(BatteryStatsImpl.this, true)) { 28926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimer = null; 28936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 28946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return false; 28966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimer = readTimerFromParcel(unpluggables, in); 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimer, batteryRealtime); 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getSensorTime() { 29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTimer; 29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2910eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2911eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHandle() { 29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHandle; 29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable { 29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in user code. 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUserTime; 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in kernel code. 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSystemTime; 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times the process has been started. 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2937eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Amount of time the process was running in the foreground. 2938eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 2939eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mForegroundTime; 2940eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2941eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from a previous save. 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedUserTime; 29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from a previous save. 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedSystemTime; 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from a previous save. 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2957eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from a previous save. 2958eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 2959eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLoadedForegroundTime; 2960eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2961eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from the previous run. 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUserTime; 29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from the previous run. 29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastSystemTime; 29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from the previous run. 29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2977eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from the previous run 2978eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 2979eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLastForegroundTime; 2980eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2981eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time when last unplugged. 29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedUserTime; 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time when last unplugged. 29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedSystemTime; 29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started before unplugged. 29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2996eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 2997eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time since unplugged. 2998eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 2999eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mUnpluggedForegroundTime; 3000eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3001e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter[] mSpeedBins; 3002e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3003287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ArrayList<ExcessivePower> mExcessivePower; 30049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc() { 30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 3007e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mSpeedBins = new SamplingCounter[getCpuSpeedSteps()]; 30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = mUserTime; 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = mSystemTime; 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 3014eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = mForegroundTime; 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 30216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 30226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i = 0; i < mSpeedBins.length; i++) { 30236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 30246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c != null) { 30256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(c); 30266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = null; 30276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 3031287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int countExcessivePowers() { 3032287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mExcessivePower != null ? mExcessivePower.size() : 0; 30339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3035287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public ExcessivePower getExcessivePower(int i) { 3036287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower != null) { 3037287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mExcessivePower.get(i); 30389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return null; 30409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 30429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void addExcessiveWake(long overTime, long usedTime) { 3043287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 3044287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 30459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 3046287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3047287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = ExcessivePower.TYPE_WAKE; 30489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.overTime = overTime; 30499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.usedTime = usedTime; 3050287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 30519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3053287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void addExcessiveCpu(long overTime, long usedTime) { 3054287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 3055287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 3056287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3057287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3058287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = ExcessivePower.TYPE_CPU; 3059287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.overTime = overTime; 3060287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.usedTime = usedTime; 3061287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 3062287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3063287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 3064287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void writeExcessivePowerToParcelLocked(Parcel out) { 3065287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 30669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeInt(0); 30679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return; 30689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3070287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final int N = mExcessivePower.size(); 30719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeInt(N); 30729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; i<N; i++) { 3073287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = mExcessivePower.get(i); 3074287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn out.writeInt(ew.type); 30759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeLong(ew.overTime); 30769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeLong(ew.usedTime); 30779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3080287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void readExcessivePowerFromParcelLocked(Parcel in) { 30819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn final int N = in.readInt(); 30829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (N == 0) { 3083287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = null; 30849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return; 30859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3087287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 30889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; i<N; i++) { 3089287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3090287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = in.readInt(); 30919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.overTime = in.readLong(); 30929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.usedTime = in.readLong(); 3093287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 30949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 30969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUserTime); 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mSystemTime); 3100eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mForegroundTime); 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedUserTime); 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedSystemTime); 3104eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mLoadedForegroundTime); 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedUserTime); 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedSystemTime); 3108eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mUnpluggedForegroundTime); 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 3110e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3111e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(mSpeedBins.length); 3112e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length; i++) { 31136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 31146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c != null) { 31156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 31166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn c.writeToParcel(out); 31176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 31186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 31196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3120e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 31219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3122287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn writeExcessivePowerToParcelLocked(out); 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime = in.readLong(); 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime = in.readLong(); 3128eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime = in.readLong(); 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedUserTime = in.readLong(); 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedSystemTime = in.readLong(); 3132eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mLoadedForegroundTime = in.readLong(); 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 31343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastUserTime = 0; 31353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastSystemTime = 0; 31363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastForegroundTime = 0; 31373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStarts = 0; 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = in.readLong(); 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = in.readLong(); 3140eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = in.readLong(); 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 3142e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3143e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani int bins = in.readInt(); 31446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int steps = getCpuSpeedSteps(); 31456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps]; 3146e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < bins; i++) { 31476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 31486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = new SamplingCounter(mUnpluggables, in); 31496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3150e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 31519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3152287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn readExcessivePowerFromParcelLocked(in); 31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCpuTimeLocked(int utime, int stime) { 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime += utime; 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime += stime; 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3164eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public void addForegroundTimeLocked(long ttime) { 3165eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime += ttime; 3166eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3167eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incStartsLocked() { 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getUserTime(int which) { 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastUserTime; 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mUserTime; 31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedUserTime; 31816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedUserTime; 31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSystemTime(int which) { 31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastSystemTime; 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mSystemTime; 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedSystemTime; 31976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedSystemTime; 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3205eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public long getForegroundTime(int which) { 3206eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long val; 3207eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_LAST) { 3208eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mLastForegroundTime; 3209eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } else { 3210eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mForegroundTime; 3211eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_CURRENT) { 3212eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mLoadedForegroundTime; 32136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 3214eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mUnpluggedForegroundTime; 3215eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3216eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3217eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani return val; 3218eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3219eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3220eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 32296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3235e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3236e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /* Called by ActivityManagerService when CPU times are updated. */ 3237e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void addSpeedStepTimes(long[] values) { 3238e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length && i < values.length; i++) { 32396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long amt = values[i]; 32406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (amt != 0) { 32416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 32426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c == null) { 32436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = c = new SamplingCounter(mUnpluggables); 32446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn c.addCountAtomic(values[i]); 32466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3247e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3248e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3249e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3250e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 3251e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public long getTimeAtCpuSpeedStep(int speedStep, int which) { 3252e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (speedStep < mSpeedBins.length) { 32536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[speedStep]; 32546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return c != null ? c.getCountLocked(which) : 0; 3255e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } else { 3256e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return 0; 3257e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3258e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable { 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times this package has done something that could wake up the 32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mWakeups; 32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device loaded from a 32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous save. 32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedWakeups; 32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastWakeups; 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedWakeups; 32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statics we have collected for this package's services. 32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>(); 32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg() { 32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = mWakeups; 33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 33066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 33076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 33086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups = in.readInt(); 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedWakeups = in.readInt(); 33123bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastWakeups = 0; 33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = in.readInt(); 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numServs = in.readInt(); 33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.clear(); 33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int m = 0; m < numServs; m++) { 33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String serviceName = in.readString(); 33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = new Serv(); 33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.put(serviceName, serv); 33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.readFromParcelLocked(in); 33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakeups); 33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedWakeups); 33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedWakeups); 33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mServiceStats.size()); 33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) { 33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(servEntry.getKey()); 33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = servEntry.getValue(); 33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.writeToParcelLocked(out); 33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() { 33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServiceStats; 33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWakeups(int which) { 33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastWakeups; 33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mWakeups; 33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedWakeups; 33546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedWakeups; 33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable { 33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left started. 33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartTime; 33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been started and not yet stopped, this is 33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started. 33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRunningSince; 33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently running. 33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning; 33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number of times startService() has been called. 33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left launched. 33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedTime; 33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been launched and not yet exited, this is 33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was launched (ms in battery uptime). 33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedSince; 33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently launched. 34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLaunched; 34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number times the service has been launched. 34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLaunches; 34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started loaded from a previous save 34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (ms in battery uptime). 34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedStartTime; 34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts loaded from a previous save. 34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches loaded from a previous save. 34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedLaunches; 34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started as of the last run (ms 34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastStartTime; 34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts as of the last run. 34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches as of the last run. 34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastLaunches; 34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started when last unplugged (ms 34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedStartTime; 34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts when last unplugged. 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches when last unplugged. 34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedLaunches; 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Serv() { 34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime); 34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = mLaunches; 34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 34706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 34716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 34726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime = in.readLong(); 34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = in.readLong(); 34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = in.readInt() != 0; 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime = in.readLong(); 34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = in.readLong(); 34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = in.readInt() != 0; 34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches = in.readInt(); 34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStartTime = in.readLong(); 34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedLaunches = in.readInt(); 34853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStartTime = 0; 34863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStarts = 0; 34873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastLaunches = 0; 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = in.readLong(); 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = in.readInt(); 34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mStartTime); 34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRunningSince); 34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mRunning ? 1 : 0); 34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedTime); 34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedSince); 35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunched ? 1 : 0); 35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunches); 35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedStartTime); 35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedLaunches); 35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedStartTime); 35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedLaunches); 35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getLaunchTimeToNowLocked(long batteryUptime) { 35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) return mLaunchedTime; 35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLaunchedTime + batteryUptime - mLaunchedSince; 35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getStartTimeToNowLocked(long batteryUptime) { 35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) return mStartTime; 35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartTime + batteryUptime - mRunningSince; 35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLaunchedLocked() { 35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) { 35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches++; 35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = getBatteryUptimeLocked(); 35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = true; 35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopLaunchedLocked() { 35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLaunched) { 35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mLaunchedSince; 35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime += time; 35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches--; 35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = false; 35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startRunningLocked() { 35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) { 35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = getBatteryUptimeLocked(); 35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopRunningLocked() { 35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRunning) { 35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mRunningSince; 35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime += time; 35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts--; 35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = false; 35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLaunches(int which) { 35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastLaunches; 35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLaunches; 35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedLaunches; 35746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedLaunches; 35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getStartTime(long now, int which) { 35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStartTime; 35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = getStartTimeToNowLocked(now); 35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStartTime; 35916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStartTime; 35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 36086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incWakeupsLocked() { 36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups++; 36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Serv newServiceStatsLocked() { 36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Serv(); 36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Proc getProcessStatsLocked(String name) { 36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc ps = mProcessStats.get(name); 36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Proc(); 36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(name, ps); 36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3644b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public SparseArray<? extends Pid> getPidStats() { 3645b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn return mPids; 3646b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 3647b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn 36489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public Pid getPidStatsLocked(int pid) { 36499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = mPids.get(pid); 36509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p == null) { 36519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p = new Pid(); 36529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPids.put(pid, p); 36539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 36549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return p; 36559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 36569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg getPackageStatsLocked(String name) { 36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = mPackageStats.get(name); 36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Pkg(); 36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(name, ps); 36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg.Serv getServiceStatsLocked(String pkg, String serv) { 36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = getPackageStatsLocked(pkg); 36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg.Serv ss = ps.mServiceStats.get(serv); 36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ss == null) { 36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss = ps.newServiceStatsLocked(); 36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps.mServiceStats.put(serv, ss); 36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getWakeTimerLocked(String name, int type) { 36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Wakelock wl = mWakelockStats.get(name); 36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl == null) { 36899e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) { 36909e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn name = BATCHED_WAKELOCK_NAME; 36919e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = mWakelockStats.get(name); 36929e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 36939e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (wl == null) { 36949e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = new Wakelock(); 36959e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn mWakelockStats.put(name, wl); 36969e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = null; 36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: 37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerPartial; 37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 37030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL, 37040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPartialTimers, mUnpluggables); 37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial = t; 37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: 37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerFull; 37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 37110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL, 37120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullTimers, mUnpluggables); 37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull = t; 37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: 37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerWindow; 37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 37190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW, 37200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWindowTimers, mUnpluggables); 37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow = t; 37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("type=" + type); 37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) { 37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sensor se = mSensorStats.get(sensor); 37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se == null) { 37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!create) { 37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se = new Sensor(sensor); 37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensor, se); 37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = se.mTimer; 37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor); 37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timers == null) { 3744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar timers = new ArrayList<StopwatchTimer>(); 37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(sensor, timers); 37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables); 37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer = t; 37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartWakeLocked(int pid, String name, int type) { 3753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37571ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { 37589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = getPidStatsLocked(pid); 3759b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn if (p.mWakeStart == 0) { 3760b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn p.mWakeStart = SystemClock.elapsedRealtime(); 3761b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn } 37629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopWakeLocked(int pid, String name, int type) { 3766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37701ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { 37719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = mPids.get(pid); 3772b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn if (p != null && p.mWakeStart != 0) { 37739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart; 37749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.mWakeStart = 0; 37759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 37769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 37779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 37789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 37799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) { 37809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Proc p = getProcessStatsLocked(proc); 37819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p != null) { 37829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.addExcessiveWake(overTime, usedTime); 37839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3786287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) { 3787287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Proc p = getProcessStatsLocked(proc); 3788287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (p != null) { 3789287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn p.addExcessiveCpu(overTime, usedTime); 3790287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3791287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3792287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int sensor) { 3794c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, true); 37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int sensor) { 38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't create a timer if one doesn't already exist 3802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, false); 38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps() { 3809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true); 38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps() { 3816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false); 38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 3819244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(String filename) { 38281afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = new JournaledFile(new File(filename), new File(filename + ".tmp")); 38290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = new MyHandler(); 38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 38310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables); 3832617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 38330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables); 3834617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3835617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables); 38360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables); 3837627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 38380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables); 3839627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 38400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables); 3841627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 38420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables); 3843627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 38440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables); 384558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables); 38460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables); 38470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables); 38480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables); 38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = false; 38506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn initTimes(); 38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = 0; 38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = 0; 38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 3857633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = 0; 38586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = 0; 3859633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = 0; 38603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = 0; 38613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = 0; 38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(Parcel p) { 38651afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 38660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = null; 38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcel(p); 38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void setCallback(BatteryCallback cb) { 38710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mCallback = cb; 38720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 38730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 3874e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void setNumSpeedSteps(int steps) { 3875e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (sNumSpeedSteps == 0) sNumSpeedSteps = steps; 3876e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3877e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3878f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void setRadioScanningTimeout(long timeout) { 3879f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mPhoneSignalScanningTimer != null) { 3880f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.setTimeout(timeout); 3881f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 3882f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 3883f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 3884ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn private HistoryItem mHistoryIterator; 3885ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 3886ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public boolean startIteratingHistoryLocked() { 3887ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return (mHistoryIterator = mHistory) != null; 3888ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 3889ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 3890ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public boolean getNextHistoryLocked(HistoryItem out) { 3891ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn HistoryItem cur = mHistoryIterator; 3892ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (cur == null) { 3893ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return false; 3894ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 3895ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn out.setTo(cur); 3896ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mHistoryIterator = cur.next; 3897ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return true; 3898ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 3899ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 39016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public HistoryItem getHistory() { 390232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn return mHistory; 390332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 390432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 390532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn @Override 3906b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public long getHistoryBaseTime() { 3907b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn return mHistoryBaseTime; 3908b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 3909b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn 3910b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn @Override 39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStartCount() { 39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartCount; 39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public boolean isScreenOn() { 39209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return mScreenOn; 39219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 39229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 39236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void initTimes() { 39246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mBatteryRealtime = mTrackBatteryPastUptime = 0; 39256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mBatteryUptime = mTrackBatteryPastRealtime = 0; 39266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 39276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 39286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 39296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 39306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 39326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void resetAllStatsLocked() { 39336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStartCount = 0; 39346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn initTimes(); 39359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mScreenOnTimer.reset(this, false); 39366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 39379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mScreenBrightnessTimer[i].reset(this, false); 39386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mInputEventCounter.reset(false); 39409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneOnTimer.reset(this, false); 39419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mAudioOnTimer.reset(this, false); 39429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mVideoOnTimer.reset(this, false); 39436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 39449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneSignalStrengthsTimer[i].reset(this, false); 39456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneSignalScanningTimer.reset(this, false); 39476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 39489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneDataConnectionsTimer[i].reset(this, false); 39496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWifiOnTimer.reset(this, false); 395158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.reset(this, false); 39529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBluetoothOnTimer.reset(this, false); 39536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 39546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<mUidStats.size(); i++) { 39556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUidStats.valueAt(i).reset()) { 39566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUidStats.remove(mUidStats.keyAt(i)); 39576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn i--; 39586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 39616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mKernelWakelockStats.size() > 0) { 39626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (SamplingTimer timer : mKernelWakelockStats.values()) { 39636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(timer); 39646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mKernelWakelockStats.clear(); 39666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 39686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn clearHistoryLocked(); 39696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 39716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void setOnBattery(boolean onBattery, int oldStatus, int level) { 39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 39736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean doWrite = false; 39740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE); 39750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn m.arg1 = onBattery ? 1 : 0; 39760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.sendMessage(m); 39776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mOnBattery = mOnBatteryInternal = onBattery; 39786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 39796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long uptime = SystemClock.uptimeMillis() * 1000; 39806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long mSecRealtime = SystemClock.elapsedRealtime(); 39816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long realtime = mSecRealtime * 1000; 39826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (onBattery) { 39836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // We will reset our status if we are unplugging after the 39846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // battery was last full, or the level is at 100, or 39856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // we have gone through a significant charge (from a very low 39866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // level to a now very high level). 39876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (oldStatus == BatteryManager.BATTERY_STATUS_FULL 39886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn || level >= 100 39896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn || (mDischargeCurrentLevel < 20 && level > 90)) { 39906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn doWrite = true; 39916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn resetAllStatsLocked(); 39926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeStartLevel = level; 39933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = 0; 39943bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = 0; 39956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn updateKernelWakelocksLocked(); 39976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 39986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 39996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: " 40006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 40016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(mSecRealtime); 40026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTrackBatteryUptimeStart = uptime; 40036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTrackBatteryRealtimeStart = realtime; 40046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime); 40056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime); 40066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeCurrentLevel = mDischargeUnplugLevel = level; 40076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime); 40086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 40096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn updateKernelWakelocksLocked(); 40106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 40116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 40126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: " 40136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 40146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(mSecRealtime); 40156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; 40166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; 40176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeCurrentLevel = level; 40183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (level < mDischargeUnplugLevel) { 401999d0452ddc0a0435030a462bda9f4d57b58bad9aDianne Hackborn mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1; 402099d0452ddc0a0435030a462bda9f4d57b58bad9aDianne Hackborn mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level; 40213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 40226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); 40236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) { 40256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFile != null) { 4026ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeAsyncLocked(); 40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4031633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 40326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // This should probably be exposed in the API, though it's not critical 40336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn private static final int BATTERY_PLUGGED_NONE = 0; 40346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 40356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void setBatteryState(int status, int health, int plugType, int level, 40366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int temp, int volt) { 40376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean onBattery = plugType == BATTERY_PLUGGED_NONE; 40386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int oldStatus = mHistoryCur.batteryStatus; 40396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mHaveBatteryLevel) { 40406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHaveBatteryLevel = true; 40416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // We start out assuming that the device is plugged in (not 40426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // on battery). If our first report is now that we are indeed 40436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // plugged in, then twiddle our state to correctly reflect that 40446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // since we won't be going through the full setOnBattery(). 40456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (onBattery == mOnBattery) { 40466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (onBattery) { 40476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 40486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 40496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 40506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn oldStatus = status; 40536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (onBattery) { 405532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mDischargeCurrentLevel = level; 40566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mRecordingHistory = true; 40576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (onBattery != mOnBattery) { 405932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 40606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryStatus = (byte)status; 40616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryHealth = (byte)health; 40626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryPlugType = (byte)plugType; 40636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryTemperature = (char)temp; 40646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryVoltage = (char)volt; 40656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn setOnBattery(onBattery, oldStatus, level); 40666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 40676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean changed = false; 40686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryCur.batteryLevel != level) { 40696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 40706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn changed = true; 40716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryCur.batteryStatus != status) { 40736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryStatus = (byte)status; 40746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn changed = true; 40756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryCur.batteryHealth != health) { 40776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryHealth = (byte)health; 40786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn changed = true; 40796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryCur.batteryPlugType != plugType) { 40816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryPlugType = (byte)plugType; 40826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn changed = true; 40836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryCur.batteryTemperature != temp) { 40856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryTemperature = (char)temp; 40866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn changed = true; 40876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryCur.batteryVoltage != volt) { 40896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryVoltage = (char)volt; 40906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn changed = true; 40916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (changed) { 40936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 40946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 40966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) { 40976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // We don't record history while we are plugged in and fully charged. 40986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // The next time we are unplugged, history will be cleared. 40996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mRecordingHistory = false; 410032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 4101633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 4102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 4103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateKernelWakelocksLocked() { 4104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = readKernelWakelockStats(); 4105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 4106d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen if (m == null) { 4107d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen // Not crashing might make board bringup easier. 41081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "Couldn't get kernel wake lock stats"); 4109d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen return; 4110d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen } 4111d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen 4112c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) { 4113c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name = ent.getKey(); 4114c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kws = ent.getValue(); 4115c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 4116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 4117c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 4118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 4119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 4120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 4121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4122c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedCount(kws.mCount); 4123c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); 4124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.setUpdateVersion(sKernelWakelockUpdateVersion); 4125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 4127c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != mKernelWakelockStats.size()) { 4128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Set timers to stale if they didn't appear in /proc/wakelocks this time. 4129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 4130c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer st = ent.getValue(); 4131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) { 4132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar st.setStale(); 4133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4134c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); 41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery(); 41449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeUptime(long curTime, int which) { 41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 41496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart); 41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastUptime; 41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mUptimeStart); 41526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart); 41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 41559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeRealtime(long curTime, int which) { 41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 41606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart); 41619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastRealtime; 41629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mRealtimeStart); 41636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart); 41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryUptime(long curTime, int which) { 41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 41716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: 41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryUptime + getBatteryUptime(curTime); 41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastUptime; 41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(curTime); 41776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: 41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime; 41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryRealtime(long curTime, int which) { 41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 41866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: 41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryRealtime + getBatteryRealtimeLocked(curTime); 41889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastRealtime; 41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 41926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: 41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime; 41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 41969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked(long curTime) { 41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastUptime; 42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 42019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryUptimeStart; 42029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 42049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked() { 42079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(SystemClock.uptimeMillis() * 1000); 42089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryUptime(long curTime) { 42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime); 42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryRealtimeLocked(long curTime) { 42169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastRealtime; 42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryRealtimeStart; 42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryRealtime(long curTime) { 42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 42283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long getTcpBytes(long current, long[] dataBytes, int which) { 42293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (which == STATS_LAST) { 42303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 42313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 42326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 42336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) { 42343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 42353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 42366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return current - dataBytes[STATS_SINCE_UNPLUGGED]; 42373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 42386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 42396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED]; 42403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 42413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return current - dataBytes[STATS_CURRENT]; 42423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 42433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 42443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 42453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 42463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesSent(int which) { 42471719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getMobileTxBytes(), mMobileDataTx, which); 42483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 42493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 42503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 42513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesReceived(int which) { 42521719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getMobileRxBytes(), mMobileDataRx, which); 42533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 42543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 42553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 42563718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesSent(int which) { 42571719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getTotalTxBytes(), mTotalDataTx, which); 42583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 42593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 42603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 42613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesReceived(int which) { 42621719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getTotalRxBytes(), mTotalDataRx, which); 42633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 42643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 4265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 4266633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevel() { 4267105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 4268633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeStartLevelLocked(); 4269105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4270105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4271105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 4272633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevelLocked() { 42736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mDischargeUnplugLevel; 4274105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4275105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 4276105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 4277633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevel() { 4278105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 4279633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeCurrentLevelLocked(); 4280105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4281105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4282105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 4283633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevelLocked() { 4284633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return mDischargeCurrentLevel; 4285105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 42869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4287e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 42883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public int getLowDischargeAmountSinceCharge() { 42893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn synchronized(this) { 42903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn return mLowDischargeAmountSinceCharge; 42913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 42923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 42933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 42943bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn @Override 42953bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public int getHighDischargeAmountSinceCharge() { 42963bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn synchronized(this) { 42973bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn return mHighDischargeAmountSinceCharge; 42983bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 42993bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 43003bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 43013bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn @Override 4302e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public int getCpuSpeedSteps() { 4303e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return sNumSpeedSteps; 4304e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 4305e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular uid, creating if needed. 43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid getUidStatsLocked(int uid) { 43109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.get(uid); 43119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u == null) { 43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u = new Uid(uid); 43139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 43149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u; 43169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the statistics object for a particular uid. 43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeUidStatsLocked(int uid) { 43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.remove(uid); 43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 432432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Proc getProcessStatsLocked(int uid, String name) { 43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getProcessStatsLocked(name); 43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 433532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * Retrieve the statistics object for a particular process, given 433632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * the name of the process. 433732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @param name process name 433832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @return the statistics object for the process 433932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani */ 4340819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani public Uid.Proc getProcessStatsLocked(String name, int pid) { 434132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani int uid; 434232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani if (mUidCache.containsKey(name)) { 434332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani uid = mUidCache.get(name); 434432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } else { 4345819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani uid = Process.getUidForPid(pid); 434632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mUidCache.put(name, uid); 434732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 434832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani Uid u = getUidStatsLocked(uid); 434932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return u.getProcessStatsLocked(name); 435032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 435132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 435232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani /** 43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 43569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg getPackageStatsLocked(int uid, String pkg) { 43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getPackageStatsLocked(pkg); 43599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 43649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 43659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) { 43669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 43679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getServiceStatsLocked(pkg, name); 43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 437058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn /** 437158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn * Massage data to distribute any reasonable work down to more specific 437258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn * owners. Must only be called on a dead BatteryStats object! 437358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn */ 437458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void distributeWorkLocked(int which) { 437558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn // Aggregate all CPU time associated with WIFI. 437658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid wifiUid = mUidStats.get(Process.WIFI_UID); 437758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (wifiUid != null) { 437858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which); 437958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (Uid.Proc proc : wifiUid.mProcessStats.values()) { 438058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which); 438158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<mUidStats.size(); i++) { 438258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid uid = mUidStats.valueAt(i); 438358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uid.mUid != Process.WIFI_UID) { 438458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uidRunningTime = uid.getWifiRunningTime(uSecTime, which); 438558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uidRunningTime > 0) { 438658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*"); 438758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long time = proc.getUserTime(which); 438858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 438958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mUserTime += time; 439058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mUserTime -= time; 439158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = proc.getSystemTime(which); 439258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 439358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mSystemTime += time; 439458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mSystemTime -= time; 439558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = proc.getForegroundTime(which); 439658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 439758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mForegroundTime += time; 439858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mForegroundTime -= time; 439958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int sb=0; sb<proc.mSpeedBins.length; sb++) { 440058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn SamplingCounter sc = proc.mSpeedBins[sb]; 440158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (sc != null) { 440258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = sc.getCountLocked(which); 440358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 440458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn SamplingCounter uidSc = uidProc.mSpeedBins[sb]; 440558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uidSc == null) { 440658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidSc = new SamplingCounter(mUnpluggables); 440758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mSpeedBins[sb] = uidSc; 440858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 440958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidSc.mCount.addAndGet((int)time); 441058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn sc.mCount.addAndGet((int)-time); 441158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 441258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 441358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn totalRunningTime -= uidRunningTime; 441458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 441558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 441658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 441758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 441858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 441958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 442058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 44216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void shutdownLocked() { 4422ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeSyncLocked(); 44236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mShuttingDown = true; 44241afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 44256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 4426ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Parcel mPendingWrite = null; 4427ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn final ReentrantLock mWriteLock = new ReentrantLock(); 4428ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4429ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void writeAsyncLocked() { 4430ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeLocked(false); 4431ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4432ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4433ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void writeSyncLocked() { 4434ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeLocked(true); 4435ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4436ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4437ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn void writeLocked(boolean sync) { 44381afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 44391afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "writeLocked: no file associated with this instance"); 44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mShuttingDown) { 44446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 44456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 4447ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Parcel out = Parcel.obtain(); 4448ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeSummaryToParcel(out); 4449ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mLastWriteTime = SystemClock.elapsedRealtime(); 4450ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4451ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (mPendingWrite != null) { 4452ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite.recycle(); 4453ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4454ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite = out; 4455ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4456ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (sync) { 4457ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn commitPendingDataToDisk(); 4458ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } else { 4459ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Thread thr = new Thread("BatteryStats-Write") { 4460ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn @Override 4461ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void run() { 4462ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 4463ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn commitPendingDataToDisk(); 4464ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4465ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn }; 4466ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn thr.start(); 4467ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4468ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4469ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4470ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void commitPendingDataToDisk() { 4471f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn final Parcel next; 4472ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn synchronized (this) { 4473ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn next = mPendingWrite; 4474ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite = null; 4475f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn if (next == null) { 4476f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn return; 4477f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn } 4478ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 4479ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mWriteLock.lock(); 4480ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4481ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 44831afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite()); 4484ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn stream.write(next.marshall()); 44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.flush(); 44868bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn FileUtils.sync(stream); 44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 44881afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile.commit(); 44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 44901afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "Error writing battery statistics", e); 4491ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mFile.rollback(); 4492ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } finally { 4493ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn next.recycle(); 4494ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mWriteLock.unlock(); 44959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static byte[] readFully(FileInputStream stream) throws java.io.IOException { 44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 45009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int avail = stream.available(); 45019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[avail]; 45029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 45039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int amt = stream.read(data, pos, data.length-pos); 45049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "Read " + amt + " bytes at " + pos 45059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " of avail " + data.length); 45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt <= 0) { 45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "**** FINISHED READING: pos=" + pos 45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " len=" + data.length); 45099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos += amt; 45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project avail = stream.available(); 45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (avail > data.length-pos) { 45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] newData = new byte[pos+avail]; 45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(data, 0, newData, 0, pos); 45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = newData; 45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readLocked() { 45221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 45231afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readLocked: no file associated with this instance"); 45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 45301afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn File file = mFile.chooseForRead(); 45311afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (!file.exists()) { 45321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45341afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileInputStream stream = new FileInputStream(file); 45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] raw = readFully(stream); 45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in = Parcel.obtain(); 45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.unmarshall(raw, 0, raw.length); 45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.setDataPosition(0); 45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSummaryFromParcel(in); 45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(java.io.IOException e) { 45441afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.e("BatteryStats", "Error reading battery statistics", e); 45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 45476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime(), HistoryItem.CMD_START); 45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 455432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn void readHistory(Parcel in) { 455532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistory = mHistoryEnd = mHistoryCache = null; 45566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryBaseTime = 0; 455732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn long time; 455832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn while ((time=in.readLong()) >= 0) { 45596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem rec = new HistoryItem(time, in); 45606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(rec); 45616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (rec.time > mHistoryBaseTime) { 45626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryBaseTime = rec.time; 45636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 456432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 45651e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn 45661e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn long oldnow = SystemClock.elapsedRealtime() - (5*60*100); 45671e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn if (oldnow > 0) { 45681e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // If the system process has restarted, but not the entire 45691e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // system, then the mHistoryBaseTime already accounts for 45701e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // much of the elapsed time. We thus want to adjust it back, 45711e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // to avoid large gaps in the data. We determine we are 45721e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // in this case by arbitrarily saying it is so if at this 45731e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn // point in boot the elapsed time is already more than 5 seconds. 45741e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn mHistoryBaseTime -= oldnow; 45751e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn } 457632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 457732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 457832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn void writeHistory(Parcel out) { 45796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem rec = mHistory; 458032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn while (rec != null) { 458132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec.time >= 0) rec.writeToParcel(out, 0); 458232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec = rec.next; 458332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 458432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn out.writeLong(-1); 458532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 458632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSummaryFromParcel(Parcel in) { 45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int version = in.readInt(); 45899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (version != VERSION) { 45901afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readFromParcel: version got " + version 45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", expected " + VERSION + "; erasing old stats"); 45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn readHistory(in); 459632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 45979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 45989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 45999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 46009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 46019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 46026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = in.readInt(); 4603633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 46043bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = in.readInt(); 46053bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = in.readInt(); 4606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 46079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 46089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 46109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.readSummaryFromParcelLocked(in); 4611617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 4612617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); 4613617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4614617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.readSummaryFromParcelLocked(in); 46159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 46169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.readSummaryFromParcelLocked(in); 4617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 4618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in); 4619627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 4620f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in); 4621627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 4622627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in); 4623627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 4624105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 4625105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.readSummaryFromParcelLocked(in); 462658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 462758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in); 4628105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 4629105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.readSummaryFromParcelLocked(in); 46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 46321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NKW > 10000) { 46331afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW); 46341afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 46351afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 4636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 4637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 4638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String kwltName = in.readString(); 4639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in); 4640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4642e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 4643e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 4644e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = in.readInt(); 46461afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NU > 10000) { 46471afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many uids " + NU); 46481afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 46491afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 46529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 46539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 46549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 465558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunning = false; 46566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 465758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunningTimer.readSummaryFromParcelLocked(in); 46586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4659105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockOut = false; 46606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 46616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); 46626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4663105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockOut = false; 46646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 46656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); 46666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 46675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastEnabled = false; 46686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 46696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mWifiMulticastTimer.readSummaryFromParcelLocked(in); 46706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 46716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOn = false; 46726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 46736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in); 46746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 46756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOn = false; 46766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 46776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in); 46786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 46795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 4680617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() != 0) { 4681617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 4682617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.initUserActivityLocked(); 4683617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4684617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 4685617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); 4686617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4687617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4688617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 46899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = in.readInt(); 46901afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NW > 10000) { 46911afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many wake locks " + NW); 46921afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 46931afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iw = 0; iw < NW; iw++) { 46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wlName = in.readString(); 46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in); 46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 47009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in); 47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in); 47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = in.readInt(); 47081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NP > 10000) { 47091afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many sensors " + NP); 47101afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 47111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 47129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NP; is++) { 47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int seNumber = in.readInt(); 47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getSensorTimerLocked(seNumber, true) 47169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .readSummaryFromParcelLocked(in); 47179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 47211afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NP > 10000) { 47221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many processes " + NP); 47231afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 47241afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 47259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String procName = in.readString(); 47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc p = u.getProcessStatsLocked(procName); 47289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mUserTime = p.mLoadedUserTime = in.readLong(); 47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mSystemTime = p.mLoadedSystemTime = in.readLong(); 47309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStarts = p.mLoadedStarts = in.readInt(); 473158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int NSB = in.readInt(); 473258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins = new SamplingCounter[NSB]; 473358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<NSB; i++) { 473458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (in.readInt() != 0) { 473558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins[i] = new SamplingCounter(mUnpluggables); 473658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins[i].readSummaryFromParcelLocked(in); 473758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 473858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 4739287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn p.readExcessivePowerFromParcelLocked(in); 47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 47431afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NP > 10000) { 47441afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many packages " + NP); 47451afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 47461afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 47489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = in.readString(); 47499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg p = u.getPackageStatsLocked(pkgName); 47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mWakeups = p.mLoadedWakeups = in.readInt(); 47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = in.readInt(); 47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NS; is++) { 47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String servName = in.readString(); 47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); 47559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStartTime = s.mLoadedStartTime = in.readLong(); 47569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStarts = s.mLoadedStarts = in.readInt(); 47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLaunches = s.mLoadedLaunches = in.readInt(); 47589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesReceived = in.readLong(); 47629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesSent = in.readLong(); 47639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 47679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a summary of the statistics to a Parcel, in a format suitable to be written to 47689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disk. This format does not allow a lossless round-trip. 47699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 47709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 47719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 47729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeSummaryToParcel(Parcel out) { 47739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW_SYS = SystemClock.uptimeMillis() * 1000; 47749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000; 47759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW = getBatteryUptimeLocked(NOW_SYS); 47769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS); 47779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(VERSION); 47799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 478032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn writeHistory(out); 478132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 47829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 47836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED)); 47846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); 47856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED)); 47866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); 47876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(mDischargeUnplugLevel); 4788633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 47893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mLowDischargeAmountSinceCharge); 47903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mHighDischargeAmountSinceCharge); 47919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 4793617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 4794617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 4795617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4796617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeSummaryFromParcelLocked(out); 47979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 4798627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 4799627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 4800627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 4801f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 4802627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 4803627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 4804627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 4805105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 480658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 4807105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 48089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 4810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 4811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer kwlt = ent.getValue(); 4812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 4813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 4814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 4815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL); 4816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 4817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 4818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 4821e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 48229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = mUidStats.size(); 48239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NU); 48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(iu)); 48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 4827105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 482858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (u.mWifiRunningTimer != null) { 48296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 483058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 48316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 48326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 48336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 48346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mFullWifiLockTimer != null) { 48356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 48366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 48376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 48386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 48396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 48406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mScanWifiLockTimer != null) { 48416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 48426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 48436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 48446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 48456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 48466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mWifiMulticastTimer != null) { 48476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 48486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL); 48496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 48506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 48516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 48526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mAudioTurnedOnTimer != null) { 48536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 48546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 48556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 48566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 48576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 48586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mVideoTurnedOnTimer != null) { 48596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 48606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 48616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 48626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 48636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 48649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4865617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 4866617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 4867617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 4868617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 4869617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 4870617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); 4871617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4872617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4873617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 48749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = u.mWakelockStats.size(); 48759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NW); 48769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 48779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent 48789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mWakelockStats.entrySet()) { 48799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 48809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 48819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerFull != null) { 48829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 48839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL); 48849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 48859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 48869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerPartial != null) { 48889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 48899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL); 48909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 48919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 48929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerWindow != null) { 48949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 48959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL); 48969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 48979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 48989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 48999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NSE = u.mSensorStats.size(); 49039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NSE); 49049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NSE > 0) { 49059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent 49069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mSensorStats.entrySet()) { 49079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ent.getKey()); 49089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 49099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se.mTimer != null) { 49109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 49119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL); 49129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 49139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 49149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = u.mProcessStats.size(); 49199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 49209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent 49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mProcessStats.entrySet()) { 49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 49259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime); 49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime); 49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts); 492858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final int N = ps.mSpeedBins.length; 492958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(N); 493058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 493158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (ps.mSpeedBins[i] != null) { 493258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(1); 493358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn ps.mSpeedBins[i].writeSummaryFromParcelLocked(out); 493458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 493558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(0); 493658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 493758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 4938287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ps.writeExcessivePowerToParcelLocked(out); 49399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = u.mPackageStats.size(); 49439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 49459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent 49469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mPackageStats.entrySet()) { 49479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 49489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 49499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups); 49509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = ps.mServiceStats.size(); 49519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NS); 49529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NS > 0) { 49539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent 49549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : ps.mServiceStats.entrySet()) { 49559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(sent.getKey()); 49569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue(); 49579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = ss.getStartTimeToNowLocked(NOW); 49589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time); 49599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts); 49609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches); 49619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED)); 49676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED)); 49689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readFromParcel(Parcel in) { 49729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcelLocked(in); 49739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = in.readInt(); 49779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != MAGIC) { 49789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ParcelFormatException("Bad magic number"); 49799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 498132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn readHistory(in); 498232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 49839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 49849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 49853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mBatteryLastUptime = 0; 49869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 49873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mBatteryLastRealtime = 0; 49889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 49890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in); 4990617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 49910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, 49920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 4993617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4994617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables, in); 49959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 49960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 4997627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 49980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, 49990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5000627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 50010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in); 5002627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 50030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, 50040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5005627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5006105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 50070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 500858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 500958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 5010105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 50110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 50129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 50139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = in.readLong(); 50143bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastUptime = 0; 50159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 50169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = in.readLong(); 50173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastRealtime = 0; 50189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = in.readInt() != 0; 50199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBatteryInternal = false; // we are no longer really running. 50209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = in.readLong(); 50219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = in.readLong(); 50229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = in.readLong(); 50239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = in.readLong(); 50249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = in.readLong(); 50259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = in.readLong(); 50266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = in.readInt(); 5027633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 50283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = in.readInt(); 50293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = in.readInt(); 50309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = in.readLong(); 50319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50323718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataRx[STATS_LAST] = in.readLong(); 50336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1; 50343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataTx[STATS_LAST] = in.readLong(); 50356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1; 50363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataRx[STATS_LAST] = in.readLong(); 50376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1; 50383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataTx[STATS_LAST] = in.readLong(); 50396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1; 50403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 50413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = in.readLong(); 50423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 50433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 50443f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = in.readInt(); 50453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 50463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 5047c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.clear(); 5048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 5049c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 5050c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 5051c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String wakelockName = in.readString(); 5052244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel 5053c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); 5054c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(wakelockName, kwlt); 5055c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5056c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5057c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 50589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers.clear(); 50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers.clear(); 50609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers.clear(); 506158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers.clear(); 506258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers.clear(); 506358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mScanWifiLockTimers.clear(); 506458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers.clear(); 50659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5066e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 5067e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 50689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numUids = in.readInt(); 50699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 50709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numUids; i++) { 50719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 50729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.readFromParcelLocked(mUnpluggables, in); 50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.append(uid, u); 50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 50793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn writeToParcelLocked(out, true, flags); 50803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 50813bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 50823bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public void writeToParcelWithoutUids(Parcel out, int flags) { 50833bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn writeToParcelLocked(out, false, flags); 50849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 50873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn void writeToParcelLocked(Parcel out, boolean inclUids, int flags) { 50889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecUptime = SystemClock.uptimeMillis() * 1000; 50899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 50909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptimeLocked(uSecUptime); 50919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(MAGIC); 509432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 509532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn writeHistory(out); 509632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryUptime); 50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryRealtime); 51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeToParcel(out, batteryRealtime); 5101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 5102617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime); 5103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeToParcel(out); 51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeToParcel(out, batteryRealtime); 5106627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 5107627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime); 5108627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5109f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime); 5110627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 5111627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime); 5112627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5113105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeToParcel(out, batteryRealtime); 511458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime); 5115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeToParcel(out, batteryRealtime); 51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptime); 51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptimeStart); 51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtime); 51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtimeStart); 51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mOnBattery ? 1 : 0); 51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryUptime); 51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryUptimeStart); 51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryRealtime); 51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryRealtimeStart); 51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryUptime); 51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryRealtime); 51276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(mDischargeUnplugLevel); 5128633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 51293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mLowDischargeAmountSinceCharge); 51303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mHighDischargeAmountSinceCharge); 51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastWriteTime); 51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED)); 51346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED)); 51356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED)); 51366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED)); 51373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 51383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Write radio uptime for data 51393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeLong(getRadioDataUptime()); 51403f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 51413f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeInt(getBluetoothPingCount()); 51423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 51433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (inclUids) { 51443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mKernelWakelockStats.size()); 51453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 51463bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn SamplingTimer kwlt = ent.getValue(); 51473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (kwlt != null) { 51483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(1); 51493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeString(ent.getKey()); 51503bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn Timer.writeTimerToParcel(out, kwlt, batteryRealtime); 51513bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 51523bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 51533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 5154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 51553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 51563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 5157c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5158e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 5159e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 5160e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 51613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (inclUids) { 51623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int size = mUidStats.size(); 51633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(size); 51643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn for (int i = 0; i < size; i++) { 51653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mUidStats.keyAt(i)); 51663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn Uid uid = mUidStats.valueAt(i); 51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn uid.writeToParcelLocked(out, batteryRealtime); 51693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 51703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 51713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 51729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<BatteryStatsImpl> CREATOR = 51769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<BatteryStatsImpl>() { 51779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl createFromParcel(Parcel in) { 51789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl(in); 51799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl[] newArray(int size) { 51829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl[size]; 51839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void dumpLocked(PrintWriter pw) { 51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) { 51881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 51891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen timer:"); 51901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenOnTimer.logState(pr, " "); 5191617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 51921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen brightness #" + i + ":"); 51931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenBrightnessTimer[i].logState(pr, " "); 5194617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 51951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Input event counter:"); 51961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mInputEventCounter.logState(pr, " "); 51971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Phone timer:"); 51981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneOnTimer.logState(pr, " "); 5199627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 52001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Signal strength #" + i + ":"); 52011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneSignalStrengthsTimer[i].logState(pr, " "); 5202627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5203f37447bad3773b62176baa837908daf6edb44273Amith Yamasani pr.println("*** Signal scanning :"); 5204f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.logState(pr, " "); 5205627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 52061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Data connection type #" + i + ":"); 52071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneDataConnectionsTimer[i].logState(pr, " "); 52081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 52091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Wifi timer:"); 52101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiOnTimer.logState(pr, " "); 52111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** WifiRunning timer:"); 521258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.logState(pr, " "); 52131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Bluetooth timer:"); 52141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mBluetoothOnTimer.logState(pr, " "); 52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dumpLocked(pw); 52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5219