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 191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.text.format.DateUtils.SECOND_IN_MILLIS; 20418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkeyimport static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED; 211afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn 223f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothDevice; 233f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset; 241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.ConnectivityManager; 251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.NetworkStats; 266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackbornimport android.os.BatteryManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats; 288bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils; 290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Handler; 300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Message; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 34c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 36418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkeyimport android.os.SystemProperties; 377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 38f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState; 39e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 40627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackbornimport android.util.LogWriter; 431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 451afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport android.util.Slog; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 47ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackbornimport android.util.TimeUtils; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 491059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.net.NetworkStatsFactory; 501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.util.JournaledFile; 511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.google.android.collect.Sets; 521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 573718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.util.HashSet; 63c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator; 645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganeshimport java.util.List; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 664cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger; 67ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackbornimport java.util.concurrent.locks.ReentrantLock; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. All times are represented in microseconds except where indicated 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "BatteryStatsImpl"; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG = false; 7732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn private static final boolean DEBUG_HISTORY = false; 78e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn private static final boolean USE_OLD_HISTORY = false; // for debugging. 795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 801059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // TODO: remove "tcp" from network methods, since we measure total stats. 811059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh private static final int MAGIC = 0xBA757475; // 'BATSTATS' 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Current on-disk Parcel version 86a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn private static final int VERSION = 64 + (USE_OLD_HISTORY ? 1000 : 0); 87e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // Maximum number of items we will record in the history. 897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private static final int MAX_HISTORY_ITEMS = 2000; 905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 91f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // No, really, THIS is the maximum number of items we will record in the history. 92f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn private static final int MAX_MAX_HISTORY_ITEMS = 3000; 93f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 949e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // The maximum number of names wakelocks we will keep track of 959e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // per uid; once the limit is reached, we batch the remaining wakelocks 969e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // in to one common name. 97af17baa27196e785989e99b0ecbe7f1c98a1f0cbDianne Hackborn private static final int MAX_WAKELOCKS_PER_UID = 50; 98c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn 999e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn private static final String BATCHED_WAKELOCK_NAME = "*overflow*"; 1005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 101e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani private static int sNumSpeedSteps; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1031afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn private final JournaledFile mFile; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn static final int MSG_UPDATE_WAKELOCKS = 1; 1060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn static final int MSG_REPORT_POWER_CHANGE = 2; 107287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final long DELAY_UPDATE_WAKELOCKS = 5*1000; 1080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public interface BatteryCallback { 1100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void batteryNeedsCpuUpdate(); 1110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void batteryPowerChanged(boolean onBattery); 1120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final class MyHandler extends Handler { 1150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn @Override 1160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void handleMessage(Message msg) { 1170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn BatteryCallback cb = mCallback; 1180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn switch (msg.what) { 1190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn case MSG_UPDATE_WAKELOCKS: 1200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (cb != null) { 1210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn cb.batteryNeedsCpuUpdate(); 1220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn break; 1240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn case MSG_REPORT_POWER_CHANGE: 1250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (cb != null) { 1260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn cb.batteryPowerChanged(msg.arg1 != 0); 1270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn break; 1290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 1320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn private final MyHandler mHandler; 1340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn private BatteryCallback mCallback; 1360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected organized by uids. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SparseArray<BatteryStatsImpl.Uid> mUidStats = 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SparseArray<BatteryStatsImpl.Uid>(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A set of pools of currently active timers. When a timer is queried, we will divide the 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // elapsed time by the number of active timers to arrive at that timer's share of the time. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In order to do this, we must refresh each timer whenever the number of active timers 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes. 147c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>(); 148c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>(); 149c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>(); 150c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers 151c64edde69d18498fb2954f71a546357b07ab996aEvan Millar = new SparseArray<ArrayList<StopwatchTimer>>(); 15258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>(); 15358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>(); 15458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>(); 1556ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly final ArrayList<StopwatchTimer> mWifiScanTimers = new ArrayList<StopwatchTimer>(); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // Last partial timers we use for distributing CPU usage. 1580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>(); 1590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are the objects that will want to do something when the device 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is unplugged from power. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>(); 1635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mShuttingDown; 1655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long mHistoryBaseTime; 1676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mHaveBatteryLevel = false; 1686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean mRecordingHistory = true; 1696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int mNumHistoryItems; 1700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1711fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int MAX_HISTORY_BUFFER = 128*1024; // 128KB 1721fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn static final int MAX_MAX_HISTORY_BUFFER = 144*1024; // 144KB 1730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final Parcel mHistoryBuffer = Parcel.obtain(); 1740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final HistoryItem mHistoryLastWritten = new HistoryItem(); 1750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final HistoryItem mHistoryLastLastWritten = new HistoryItem(); 1761fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final HistoryItem mHistoryReadTmp = new HistoryItem(); 1770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int mHistoryBufferLastPos = -1; 1780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean mHistoryOverflow = false; 1790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long mLastHistoryTime = 0; 1800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final HistoryItem mHistoryCur = new HistoryItem(); 1820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistory; 1846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistoryEnd; 1859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn HistoryItem mHistoryLastEnd; 1866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem mHistoryCache; 1870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private HistoryItem mHistoryIterator; 1890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private boolean mReadOverflow; 1900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn private boolean mIteratingHistory; 1915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStartCount; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryUptime; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastUptime; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryRealtime; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastRealtime; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptime; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptimeStart; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUptime; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtime; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtimeStart; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastRealtime; 2055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mScreenOn; 207c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScreenOnTimer; 2083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 209617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mScreenBrightnessBin = -1; 210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; 2115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter mInputEventCounter; 2135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mPhoneOn; 215c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mPhoneOnTimer; 2165a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 217244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioOn; 218244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioOnTimer; 2195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 220244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoOn; 221244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoOnTimer; 2225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 223627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneSignalStrengthBin = -1; 224e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int mPhoneSignalStrengthBinRaw = -1; 225c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneSignalStrengthsTimer = 2265284090631e638b916d9a453212e9dc802656a67Wink Saville new StopwatchTimer[SignalStrength.NUM_SIGNAL_STRENGTH_BINS]; 227f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 228f37447bad3773b62176baa837908daf6edb44273Amith Yamasani StopwatchTimer mPhoneSignalScanningTimer; 229f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 230627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneDataConnectionType = -1; 2315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh final StopwatchTimer[] mPhoneDataConnectionsTimer = 232c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_DATA_CONNECTION_TYPES]; 2335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 234105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mWifiOn; 235c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiOnTimer; 236617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mWifiOnUid = -1; 237d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 23858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn boolean mGlobalWifiRunning; 23958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn StopwatchTimer mGlobalWifiRunningTimer; 2405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 241105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mBluetoothOn; 242c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mBluetoothOnTimer; 2433f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 2443f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** Bluetooth headset object */ 2453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani BluetoothHeadset mBtHeadset; 2463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These provide time bases that discount the time the device is plugged 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in to power. 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBattery; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBatteryInternal; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastUptime; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryUptimeStart; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastRealtime; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryRealtimeStart; 2573718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryUptime; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryRealtime; 2603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 261105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /* 262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * These keep track of battery levels (1-100) at the last plug event and the last unplug event. 263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 264633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeStartLevel; 2656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int mDischargeUnplugLevel; 266633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeCurrentLevel; 2673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int mLowDischargeAmountSinceCharge; 2683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int mHighDischargeAmountSinceCharge; 269c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeScreenOnUnplugLevel; 270c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeScreenOffUnplugLevel; 271c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOn; 272c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOnSinceCharge; 273c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOff; 274c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int mDischargeAmountScreenOffSinceCharge; 275244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastWriteTime = 0; // Milliseconds 277244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Mobile data transferred while on battery 2793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataTx = new long[4]; 2803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataRx = new long[4]; 2813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataTx = new long[4]; 2823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataRx = new long[4]; 2833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataUptime; 2853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataStart; 2863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 2873f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingCount; 2883f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingStart = -1; 2893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 290f37447bad3773b62176baa837908daf6edb44273Amith Yamasani private int mPhoneServiceState = -1; 291e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private int mPhoneServiceStateRaw = -1; 292e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private int mPhoneSimStateRaw = -1; 293f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 294c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 295c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Holds a SamplingTimer associated with each kernel wakelock name being tracked. 296c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 2975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh private final HashMap<String, SamplingTimer> mKernelWakelockStats = 298c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, SamplingTimer>(); 2995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 300c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public Map<String, ? extends SamplingTimer> getKernelWakelockStats() { 301c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mKernelWakelockStats; 302c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 304c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static int sKernelWakelockUpdateVersion = 0; 3055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 306c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static final int[] PROC_WAKELOCKS_FORMAT = new int[] { 307c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_STRING, // 0: name 308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 1: count 309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 310c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 311c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 312c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 5: totalTime 313c64edde69d18498fb2954f71a546357b07ab996aEvan Millar }; 3145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 31573f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor private static final int[] WAKEUP_SOURCES_FORMAT = new int[] { 31673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor Process.PROC_TAB_TERM|Process.PROC_OUT_STRING, // 0: name 31773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor Process.PROC_TAB_TERM|Process.PROC_COMBINE| 31873f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor Process.PROC_OUT_LONG, // 1: count 31973f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor Process.PROC_TAB_TERM|Process.PROC_COMBINE, 32073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor Process.PROC_TAB_TERM|Process.PROC_COMBINE, 32173f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor Process.PROC_TAB_TERM|Process.PROC_COMBINE, 32273f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor Process.PROC_TAB_TERM|Process.PROC_COMBINE, 32373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor Process.PROC_TAB_TERM|Process.PROC_COMBINE 32473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor |Process.PROC_OUT_LONG, // 6: totalTime 32573f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor }; 32673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor 327c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final String[] mProcWakelocksName = new String[3]; 328c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final long[] mProcWakelocksData = new long[3]; 3295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 330c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 331c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added 332c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * to mKernelWakelockStats. 333c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 3345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh private final Map<String, KernelWakelockStats> mProcWakelockFileStats = 335c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, KernelWakelockStats>(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>(); 3385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory(); 3401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 3411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** Network ifaces that {@link ConnectivityManager} has claimed as mobile. */ 3421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private HashSet<String> mMobileIfaces = Sets.newHashSet(); 3431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For debugging 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl() { 3461afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 3470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = null; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface Unpluggable { 351a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn void unplug(long elapsedRealtime, long batteryUptime, long batteryRealtime); 352a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * State for keeping track of counting information. 357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 358e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class Counter extends BatteryStats.Counter implements Unpluggable { 3594cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate final AtomicInteger mCount = new AtomicInteger(); 3606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn final ArrayList<Unpluggable> mUnpluggables; 361617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLoadedCount; 362617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLastCount; 363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mUnpluggedCount; 364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mPluggedCount; 3655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables, Parcel in) { 3676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 3684cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = in.readInt(); 3694cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLoadedCount = in.readInt(); 3713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = in.readInt(); 373617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 376617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables) { 3776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 379617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void writeToParcel(Parcel out) { 3824cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(mCount.get()); 383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLoadedCount); 384617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mUnpluggedCount); 385617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 387a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void unplug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 3884cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount; 3894cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 390617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 391617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 392a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 3934cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = mCount.get(); 394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * Writes a possibly null Counter to a Parcel. 398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 399617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param out the Parcel to be written to. 400617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param counter a Counter, or null. 401617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 402617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static void writeCounterToParcel(Parcel out, Counter counter) { 403617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (counter == null) { 404617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); // indicates null 405617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return; 406617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 407617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); // indicates non-null 408617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 409617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn counter.writeToParcel(out); 410617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 411617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 412617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 413c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 414617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int val; 415617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_LAST) { 416617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val = mLastCount; 417617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 4184cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate val = mCount.get(); 4196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 420617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mUnpluggedCount; 4216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 422617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mLoadedCount; 423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 424617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 425617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return val; 427617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 428617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 429617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void logState(Printer pw, String prefix) { 4304cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate pw.println(prefix + "mCount=" + mCount.get() 431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 432617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mUnpluggedCount=" + mUnpluggedCount 433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mPluggedCount=" + mPluggedCount); 434617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4364cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate void stepAtomic() { 4374cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.incrementAndGet(); 438617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 439617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 4406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 4416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear state of this counter. 4426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 4436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void reset(boolean detachIfReset) { 4446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCount.set(0); 4456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0; 4466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (detachIfReset) { 4476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn detach(); 4486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 4526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 4536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 455617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void writeSummaryFromParcelLocked(Parcel out) { 4564cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate int count = mCount.get(); 4574cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(count); 458617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 459617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 460617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void readSummaryFromParcelLocked(Parcel in) { 4614cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mLoadedCount = in.readInt(); 4624cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mLoadedCount); 4633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 4644cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount = mLoadedCount; 465617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 466617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 467e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 468e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class SamplingCounter extends Counter { 469e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 470e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) { 471e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables, in); 472e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 473e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 474e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables) { 475e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables); 476e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 477e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 4784cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void addCountAtomic(long count) { 4794cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.addAndGet((int)count); 480e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 481e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 482e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 483617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for keeping track of timing information. 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 486c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static abstract class Timer extends BatteryStats.Timer implements Unpluggable { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mType; 4886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn final ArrayList<Unpluggable> mUnpluggables; 4895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedCount; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastCount; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedCount; 4945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Times are in microseconds for better accuracy when dividing by the 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock count, and are in "battery realtime" units. 4975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we have accumulated since the start of the original 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * boot, to the last time something interesting happened in the 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current run. 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTotalTime; 5045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we loaded for the previous runs. Subtract this from 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mTotalTime to find the time for the current run of the system. 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTime; 5105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The run time of the last run of the system, as loaded from the 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved data. 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastTime; 5165a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value of mTotalTime when unplug() was last called. Subtract 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this from mTotalTime to find the time since the last unplug from 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * power. 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedTime; 5235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 524244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani /** 525244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * Constructs from a parcel. 526244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param type 527244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param unpluggables 528244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param powerType 529244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param in 530244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani */ 531c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 5336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 5345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount = in.readInt(); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedCount = in.readInt(); 5373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = in.readInt(); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = in.readLong(); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTime = in.readLong(); 5413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastTime = 0; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = in.readLong(); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 5486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables = unpluggables; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 551c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract long computeRunTimeLocked(long curBatteryRealtime); 5535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract int computeCurrentCountLocked(); 5555a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 5576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear state of this timer. Returns true if the timer is inactive 5586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * so can be completely dropped. 5596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 5609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 5616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalTime = mLoadedTime = mLastTime = 0; 5626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCount = mLoadedCount = mLastCount = 0; 5636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (detachIfReset) { 5646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn detach(); 5656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 5676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 5706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 5716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, long batteryRealtime) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mCount); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedCount); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedCount); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRunTimeLocked(batteryRealtime)); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTime); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedTime); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 582a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void unplug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedTime=" + mUnpluggedTime 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedCount=" + mUnpluggedCount); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = computeRunTimeLocked(batteryRealtime); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = mCount; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": new mUnpluggedTime=" + mUnpluggedTime 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new mUnpluggedCount=" + mUnpluggedCount); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 597a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 598c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime 600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " old mTotalTime=" + mTotalTime); 601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = computeRunTimeLocked(batteryRealtime); 603c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = computeCurrentCountLocked(); 604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType 606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + ": new mTotalTime=" + mTotalTime); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a possibly null Timer to a Parcel. 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer, or null. 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void writeTimerToParcel(Parcel out, Timer timer, 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer == null) { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); // indicates null 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); // indicates non-null 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timer.writeToParcel(out, batteryRealtime); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 628c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long getTotalTimeLocked(long batteryRealtime, int which) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastTime; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = computeRunTimeLocked(batteryRealtime); 6346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedTime; 6366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedTime; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastCount; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar val = computeCurrentCountLocked(); 6516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedCount; 6536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which != STATS_SINCE_CHARGED) { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedCount; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 661627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void logState(Printer pw, String prefix) { 662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + " mCount=" + mCount 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedCount=" + mUnpluggedCount); 665627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mTotalTime=" + mTotalTime 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedTime=" + mLoadedTime); 667627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mLastTime=" + mLastTime 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedTime=" + mUnpluggedTime); 669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 6705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 6715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long runTime = computeRunTimeLocked(batteryRealtime); 674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Divide by 1000 for backwards compatibility 675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong((runTime + 500) / 1000); 676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount); 677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Multiply by 1000 for backwards compatibility 681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = mLoadedTime = in.readLong() * 1000; 6823bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastTime = 0; 683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedTime = mTotalTime; 684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = mLoadedCount = in.readInt(); 6853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastCount = 0; 686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedCount = mCount; 687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 6895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class SamplingTimer extends Timer { 6915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported count from /proc/wakelocks. 694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mCurrentReportedCount; 696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported count from /proc/wakelocks when unplug() was last 699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUnpluggedReportedCount; 702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported total_time from /proc/wakelocks. 7055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh */ 706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mCurrentReportedTotalTime; 707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 710c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported total_time from /proc/wakelocks when unplug() was last 711c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUnpluggedReportedTotalTime; 714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently in a discharge cycle. 717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mInDischarge; 719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently recording reported values. 722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 723c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mTrackingReportedValues; 7245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 726a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * A sequence counter, incremented once for each update of the stats. 727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUpdateVersion; 7295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) { 731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables, in); 732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = in.readInt(); 733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = in.readInt(); 734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = in.readLong(); 735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = in.readLong(); 736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 7405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, 741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean trackReportedValues) { 742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables); 743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = trackReportedValues; 744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setStale() { 748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = false; 749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = 0; 750c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = 0; 751c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setUpdateVersion(int version) { 754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateVersion = version; 755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getUpdateVersion() { 758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUpdateVersion; 759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedCount(int count) { 762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedCount == 0) { 763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 764c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = count; 765c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 768c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = count; 769c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedTotalTime(long totalTime) { 772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedTotalTime == 0) { 773c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = totalTime; 775c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = totalTime; 779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 781a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void unplug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 782a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super.unplug(elapsedRealtime, batteryUptime, batteryRealtime); 783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mTrackingReportedValues) { 784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime; 785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount; 786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = true; 788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 790a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 791a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super.plug(elapsedRealtime, batteryUptime, batteryRealtime); 792c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = false; 793c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 7945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 7975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount 798c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedCount=" + mUnpluggedReportedCount 799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime 800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime); 801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 8025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 8045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh return mTotalTime + (mInDischarge && mTrackingReportedValues 805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0); 806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 8075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount + (mInDischarge && mTrackingReportedValues 810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedCount - mUnpluggedReportedCount : 0); 811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 8125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mUnpluggedReportedCount); 817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUnpluggedReportedTotalTime); 819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 8215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 8229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 8239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.reset(stats, detachIfReset); 8246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn setStale(); 8256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 8266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 8275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeSummaryFromParcelLocked(out, batteryRealtime); 830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong(); 838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount = in.readInt(); 839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 8425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 844a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * A timer that increments in batches. It does not run for durations, but just jumps 845a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * for a pre-determined amount. 846a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn */ 847a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final class BatchTimer extends Timer { 848a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final Uid mUid; 849a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 850a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn /** 851a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * The last time at which we updated the timer. This is in elapsed realtime microseconds. 852a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn */ 853a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn long mLastAddedTime; 854a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 855a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn /** 856a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * The last duration that we added to the timer. This is in microseconds. 857a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn */ 858a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn long mLastAddedDuration; 859a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 860a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn /** 861a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * Whether we are currently in a discharge cycle. 862a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn */ 863a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn boolean mInDischarge; 864a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 865a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn BatchTimer(Uid uid, int type, ArrayList<Unpluggable> unpluggables, 866a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn boolean inDischarge, Parcel in) { 867a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super(type, unpluggables, in); 868a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mUid = uid; 869a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mLastAddedTime = in.readLong(); 870a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mLastAddedDuration = in.readLong(); 871a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mInDischarge = inDischarge; 872a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 873a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 874a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn BatchTimer(Uid uid, int type, ArrayList<Unpluggable> unpluggables, 875a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn boolean inDischarge) { 876a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super(type, unpluggables); 877a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mUid = uid; 878a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mInDischarge = inDischarge; 879a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 880a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 881a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn @Override 882a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void writeToParcel(Parcel out, long batteryRealtime) { 883a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super.writeToParcel(out, batteryRealtime); 884a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn out.writeLong(mLastAddedTime); 885a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn out.writeLong(mLastAddedDuration); 886a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 887a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 888a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn @Override 889a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 890a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn recomputeLastDuration(SystemClock.elapsedRealtime() * 1000, false); 891a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mInDischarge = false; 892a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super.plug(elapsedRealtime, batteryUptime, batteryRealtime); 893a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 894a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 895a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn @Override 896a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void unplug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 897a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn recomputeLastDuration(elapsedRealtime, false); 898a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mInDischarge = true; 899a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn // If we are still within the last added duration, then re-added whatever remains. 900a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mLastAddedTime == elapsedRealtime) { 901a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mTotalTime += mLastAddedDuration; 902a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 903a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super.unplug(elapsedRealtime, batteryUptime, batteryRealtime); 904a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 905a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 906a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn @Override 907a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void logState(Printer pw, String prefix) { 908a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super.logState(pw, prefix); 909a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn pw.println(prefix + "mLastAddedTime=" + mLastAddedTime 910a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn + " mLastAddedDuration=" + mLastAddedDuration); 911a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 912a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 913a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn private long computeOverage(long curTime) { 914a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mLastAddedTime > 0) { 915a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mLastTime + mLastAddedDuration - curTime; 916a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 917a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return 0; 918a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 919a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 920a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn private void recomputeLastDuration(long curTime, boolean abort) { 921a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final long overage = computeOverage(curTime); 922a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (overage > 0) { 923a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn // Aborting before the duration ran out -- roll back the remaining 924a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn // duration. Only do this if currently discharging; otherwise we didn't 925a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn // actually add the time. 926a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mInDischarge) { 927a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mTotalTime -= overage; 928a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 929a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (abort) { 930a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mLastAddedTime = 0; 931a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } else { 932a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mLastAddedTime = curTime; 933a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mLastAddedDuration -= overage; 934a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 935a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 936a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 937a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 938a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void addDuration(BatteryStatsImpl stats, long durationMillis) { 939a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final long now = SystemClock.elapsedRealtime() * 1000; 940a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn recomputeLastDuration(now, true); 941a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mLastAddedTime = now; 942a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mLastAddedDuration = durationMillis * 1000; 943a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mInDischarge) { 944a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mTotalTime += mLastAddedDuration; 945a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mCount++; 946a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 947a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 948a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 949a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void abortLastDuration(BatteryStatsImpl stats) { 950a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final long now = SystemClock.elapsedRealtime() * 1000; 951a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn recomputeLastDuration(now, true); 952a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 953a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 954a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn @Override 955a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn protected int computeCurrentCountLocked() { 956a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mCount; 957a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 958a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 959a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn @Override 960a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn protected long computeRunTimeLocked(long curBatteryRealtime) { 961a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final long overage = computeOverage(SystemClock.elapsedRealtime() * 1000); 962a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (overage > 0) { 963a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mTotalTime = overage; 964a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 965a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mTotalTime; 966a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 967a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 968a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn @Override 969a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 970a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final long now = SystemClock.elapsedRealtime() * 1000; 971a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn recomputeLastDuration(now, true); 972a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn boolean stillActive = mLastAddedTime == now; 973a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super.reset(stats, !stillActive && detachIfReset); 974a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return !stillActive; 975a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 976a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 977a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 978a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn /** 979c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * State for keeping track of timing information. 980c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 981c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class StopwatchTimer extends Timer { 9820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final Uid mUid; 983c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mTimerPool; 9840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 985c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mNesting; 986c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 987c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 988c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The last time at which we updated the timer. If mNesting is > 0, 989c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * subtract this from the current battery time to find the amount of 990c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * time we have been running since we last computed an update. 991c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 992c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUpdateTime; 9935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 994c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 9959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn * The total time at which the timer was acquired, to determine if it 996c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * was actually held for an interesting duration. 997c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 998c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mAcquireTime; 999c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1000f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long mTimeout; 1001f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 10020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn /** 10030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn * For partial wake locks, keep track of whether we are in the list 10040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn * to consume CPU cycles. 10050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn */ 10060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn boolean mInList; 10070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 10080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool, 1009c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables, Parcel in) { 1010c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables, in); 10110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mUid = uid; 1012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 1013c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = in.readLong(); 1014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1015c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 10160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool, 1017c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables) { 1018c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables); 10190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mUid = uid; 1020c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 1021c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 10225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1023f37447bad3773b62176baa837908daf6edb44273Amith Yamasani void setTimeout(long timeout) { 1024f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mTimeout = timeout; 1025f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1026f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 1027c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 1028c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 1029c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUpdateTime); 1030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1032a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 1033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mNesting > 0) { 1034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 1035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "old mUpdateTime=" + mUpdateTime); 1036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1037a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn super.plug(elapsedRealtime, batteryUptime, batteryRealtime); 1038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = batteryRealtime; 1039c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 1040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "new mUpdateTime=" + mUpdateTime); 1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 1046c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 1047c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startRunningLocked(BatteryStatsImpl stats) { 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting++ == 0) { 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUpdateTime = stats.getBatteryRealtimeLocked( 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.elapsedRealtime() * 1000); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all currently active timers before adding 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this new one to the pool. 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add this timer to the active pool 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.add(this); 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Increment the count 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount++; 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAcquireTime = mTotalTime; 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 107332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani boolean isRunningLocked() { 107432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return mNesting > 0; 107532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 107632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopRunningLocked(BatteryStatsImpl stats) { 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore attempt to stop a timer that isn't running 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting == 0) { 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (--mNesting == 0) { 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all active counters, scaled by the total 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // active in the pool, before taking this one out of the pool. 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove this timer from the active pool 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.remove(this); 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh final long realtime = SystemClock.elapsedRealtime() * 1000; 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 1; 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = computeRunTimeLocked(batteryRealtime); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTotalTime == mAcquireTime) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there was no change in the time, then discard this 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // count. A somewhat cheezy strategy, but hey. 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount--; 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update the total time for all other running Timers with the same type as this Timer 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // due to a change in timer count 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void refreshTimersLocked(final BatteryStatsImpl stats, 1114c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> pool) { 11155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh final long realtime = SystemClock.elapsedRealtime() * 1000; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = pool.size(); 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>= 0; i--) { 1119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer t = pool.get(i); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long heldTime = batteryRealtime - t.mUpdateTime; 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (heldTime > 0) { 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mTotalTime += heldTime / N; 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mUpdateTime = batteryRealtime; 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 1129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 1130f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) { 1131f37447bad3773b62176baa837908daf6edb44273Amith Yamasani curBatteryRealtime = mUpdateTime + mTimeout; 1132f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTotalTime + (mNesting > 0 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (curBatteryRealtime - mUpdateTime) 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project / (mTimerPool != null ? mTimerPool.size() : 1) 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : 0); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 1140c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 1141c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount; 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { 11456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean canDetach = mNesting <= 0; 11469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.reset(stats, canDetach && detachIfReset); 11479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mNesting > 0) { 11489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mUpdateTime = stats.getBatteryRealtimeLocked( 11499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn SystemClock.elapsedRealtime() * 1000); 11509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 11519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mAcquireTime = mTotalTime; 11526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return canDetach; 11536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 11545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 11556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 11566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn super.detach(); 11576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPool != null) { 11586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPool.remove(this); 11596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 11606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 11615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readSummaryFromParcelLocked(Parcel in) { 1163c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1168c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> readKernelWakelockStats() { 11695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 117073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor FileInputStream is; 11713372f2e259247810627fd22033406163284f4f64Johannes Carlsson byte[] buffer = new byte[8192]; 1172c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int len; 117373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor boolean wakeup_sources = false; 11745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1175c64edde69d18498fb2954f71a546357b07ab996aEvan Millar try { 117673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor try { 117773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor is = new FileInputStream("/proc/wakelocks"); 117873f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor } catch (java.io.FileNotFoundException e) { 117973f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor try { 118073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor is = new FileInputStream("/d/wakeup_sources"); 118173f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor wakeup_sources = true; 118273f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor } catch (java.io.FileNotFoundException e2) { 118373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor return null; 118473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor } 118573f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor } 118673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor 1187c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = is.read(buffer); 1188c64edde69d18498fb2954f71a546357b07ab996aEvan Millar is.close(); 118973f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor } catch (java.io.IOException e) { 119073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor return null; 119173f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor } 1192c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 119373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor if (len > 0) { 119473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor int i; 119573f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor for (i=0; i<len; i++) { 119673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor if (buffer[i] == '\0') { 119773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor len = i; 119873f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor break; 1199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1200c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1201c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 12025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 120373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor return parseProcWakelocks(buffer, len, wakeup_sources); 1204c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 12055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1206c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> parseProcWakelocks( 120773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor byte[] wlBuffer, int len, boolean wakeup_sources) { 1208c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name; 1209c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count; 1210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long totalTime; 12111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey int startIndex; 12121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey int endIndex; 1213c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int numUpdatedWlNames = 0; 1214c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1215c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Advance past the first line. 1216c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 1217c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++); 1218c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex = i + 1; 1219c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1220c64edde69d18498fb2954f71a546357b07ab996aEvan Millar synchronized(this) { 1221c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = mProcWakelockFileStats; 12225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1223c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion++; 1224c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (endIndex < len) { 12255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh for (endIndex=startIndex; 12265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0'; 1227c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex++); 12283372f2e259247810627fd22033406163284f4f64Johannes Carlsson endIndex++; // endIndex is an exclusive upper bound. 12293372f2e259247810627fd22033406163284f4f64Johannes Carlsson // Don't go over the end of the buffer, Process.parseProcLine might 12303372f2e259247810627fd22033406163284f4f64Johannes Carlsson // write to wlBuffer[endIndex] 12313372f2e259247810627fd22033406163284f4f64Johannes Carlsson if (endIndex >= (len - 1) ) { 12323372f2e259247810627fd22033406163284f4f64Johannes Carlsson return m; 1233e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani } 1234c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1235c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String[] nameStringArray = mProcWakelocksName; 1236c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long[] wlData = mProcWakelocksData; 12372098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // Stomp out any bad characters since this is from a circular buffer 12382098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // A corruption is seen sometimes that results in the vm crashing 12392098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // This should prevent crashes and the line will probably fail to parse 12402098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani for (int j = startIndex; j < endIndex; j++) { 12412098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?'; 12422098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani } 124353b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex, 124473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor wakeup_sources ? WAKEUP_SOURCES_FORMAT : 124573f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor PROC_WAKELOCKS_FORMAT, 124673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor nameStringArray, wlData, null); 12472098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani 1248c64edde69d18498fb2954f71a546357b07ab996aEvan Millar name = nameStringArray[0]; 1249c64edde69d18498fb2954f71a546357b07ab996aEvan Millar count = (int) wlData[1]; 125073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor 125173f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor if (wakeup_sources) { 125273f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor // convert milliseconds to microseconds 125373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor totalTime = wlData[2] * 1000; 125473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor } else { 125573f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor // convert nanoseconds to microseconds with rounding. 125673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor totalTime = (wlData[2] + 500) / 1000; 125773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor } 1258c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 125953b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani if (parsed && name.length() > 0) { 1260c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (!m.containsKey(name)) { 12615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh m.put(name, new KernelWakelockStats(count, totalTime, 1262c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion)); 1263c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 1264c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 1265c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kwlStats = m.get(name); 1266c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlStats.mVersion == sKernelWakelockUpdateVersion) { 1267c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount += count; 1268c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime += totalTime; 1269c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 1270c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount = count; 1271c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime = totalTime; 1272c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mVersion = sKernelWakelockUpdateVersion; 1273c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 1274c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1275c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 127653b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani } 1277c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex; 1278c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1279c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 1280c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != numUpdatedWlNames) { 1281c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Don't report old data. 1282c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Iterator<KernelWakelockStats> itr = m.values().iterator(); 1283c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (itr.hasNext()) { 1284c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (itr.next().mVersion != sKernelWakelockUpdateVersion) { 1285c64edde69d18498fb2954f71a546357b07ab996aEvan Millar itr.remove(); 1286c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1287c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1288c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1289c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return m; 1290c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1291c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 12925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1293c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private class KernelWakelockStats { 1294c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mCount; 1295c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long mTotalTime; 1296c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mVersion; 12975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1298c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats(int count, long totalTime, int version) { 1299c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = count; 1300c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = totalTime; 1301c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mVersion = version; 1302c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1303c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 13045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1305c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 13065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh * Get the KernelWakelockTimer associated with name, and create a new one if one 1307c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * doesn't already exist. 1308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 1309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public SamplingTimer getKernelWakelockTimerLocked(String name) { 1310c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 1311c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 13125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 1313c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 1314c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 1315c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 1316c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return kwlt; 1317c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 13183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 13193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataPlug(long[] dataTransfer, long currentBytes) { 13206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_LAST] = dataTransfer[STATS_SINCE_UNPLUGGED]; 13216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_SINCE_UNPLUGGED] = -1; 13223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 13233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 13243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataUnplug(long[] dataTransfer, long currentBytes) { 13256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn dataTransfer[STATS_SINCE_UNPLUGGED] = currentBytes; 13263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 13273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 13283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 13293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Radio uptime in microseconds when transferring data. This value is very approximate. 13303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @return 13313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 13323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private long getCurrentRadioDataUptime() { 13333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani try { 13343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms"); 13353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (!awakeTimeFile.exists()) return 0; 13363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile)); 13373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani String line = br.readLine(); 13383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani br.close(); 13393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return Long.parseLong(line) * 1000; 13403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (NumberFormatException nfe) { 13413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 13423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (IOException ioe) { 13433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 13443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 13453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return 0; 13463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 13473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 13483f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 13493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @deprecated use getRadioDataUptime 13503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 13513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getRadioDataUptimeMs() { 13523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getRadioDataUptime() / 1000; 13533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 13543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 13553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 13565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh * Returns the duration that the cell radio was up for data transfers. 13573f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 13583f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public long getRadioDataUptime() { 13593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (mRadioDataStart == -1) { 13603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return mRadioDataUptime; 13613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 13623f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentRadioDataUptime() - mRadioDataStart; 13633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 13643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 13653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 13663f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int getCurrentBluetoothPingCount() { 13673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBtHeadset != null) { 13685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh List<BluetoothDevice> deviceList = mBtHeadset.getConnectedDevices(); 13695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh if (deviceList.size() > 0) { 13705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh return mBtHeadset.getBatteryUsageHint(deviceList.get(0)); 13713f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 13723f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 13733f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return -1; 13743f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 13753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 13763f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public int getBluetoothPingCount() { 13773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBluetoothPingStart == -1) { 13783f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return mBluetoothPingCount; 13793f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } else if (mBtHeadset != null) { 13803f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentBluetoothPingCount() - mBluetoothPingStart; 13813f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 138282cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani return 0; 13833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 13843f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 13853f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public void setBtHeadset(BluetoothHeadset headset) { 138682cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) { 138782cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 138882cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani } 13893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBtHeadset = headset; 13903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 13913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 13920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int mChangedBufferStates = 0; 13930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 13940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void addHistoryBufferLocked(long curTime) { 13950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mHaveBatteryLevel || !mRecordingHistory) { 13960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 13970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 13980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 13991fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final long timeDiff = (mHistoryBaseTime+curTime) - mHistoryLastWritten.time; 14000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mHistoryBufferLastPos >= 0 && mHistoryLastWritten.cmd == HistoryItem.CMD_UPDATE 14011fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn && timeDiff < 2000 14020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn && ((mHistoryLastWritten.states^mHistoryCur.states)&mChangedBufferStates) == 0) { 14030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // If the current is the same as the one before, then we no 14040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // longer need the entry. 14050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataSize(mHistoryBufferLastPos); 14060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBufferLastPos); 14070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBufferLastPos = -1; 14080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mHistoryLastLastWritten.cmd == HistoryItem.CMD_UPDATE 14091fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn && timeDiff < 500 && mHistoryLastLastWritten.same(mHistoryCur)) { 14100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // If this results in us returning to the state written 14110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // prior to the last one, then we can just delete the last 14120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // written one and drop the new one. Nothing more to do. 14130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.setTo(mHistoryLastLastWritten); 14140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL; 14150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 14160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 14170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mChangedBufferStates |= mHistoryLastWritten.states^mHistoryCur.states; 14180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn curTime = mHistoryLastWritten.time - mHistoryBaseTime; 14191fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mHistoryLastWritten.setTo(mHistoryLastLastWritten); 14200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else { 14210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mChangedBufferStates = 0; 14220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 14230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 14240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn final int dataSize = mHistoryBuffer.dataSize(); 14250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (dataSize >= MAX_HISTORY_BUFFER) { 14260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mHistoryOverflow) { 14270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryOverflow = true; 14280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(curTime, HistoryItem.CMD_OVERFLOW); 14290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 14300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 14310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Once we've reached the maximum number of items, we only 14320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // record changes to the battery level and the most interesting states. 14330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Once we've reached the maximum maximum number of items, we only 14340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // record changes to the battery level. 14350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mHistoryLastWritten.batteryLevel == mHistoryCur.batteryLevel && 14360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn (dataSize >= MAX_MAX_HISTORY_BUFFER 143745f06460e9aeadadad27e6c87817940cd96128efAmith Yamasani || ((mHistoryLastWritten.states^mHistoryCur.states) 14380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn & HistoryItem.MOST_INTERESTING_STATES) == 0)) { 14390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 14400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 14410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 14420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 14430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(curTime, HistoryItem.CMD_UPDATE); 14440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 14450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 14460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void addHistoryBufferLocked(long curTime, byte cmd) { 14470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int origPos = 0; 14480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mIteratingHistory) { 14490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn origPos = mHistoryBuffer.dataPosition(); 14500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); 14510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 14520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBufferLastPos = mHistoryBuffer.dataPosition(); 14530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastLastWritten.setTo(mHistoryLastWritten); 14540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur); 14550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.writeDelta(mHistoryBuffer, mHistoryLastLastWritten); 14560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mLastHistoryTime = curTime; 14570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "Writing history buffer: was " + mHistoryBufferLastPos 14580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " now " + mHistoryBuffer.dataPosition() 14590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " size is now " + mHistoryBuffer.dataSize()); 14600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mIteratingHistory) { 14610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(origPos); 14620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 14630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 14640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1465f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn int mChangedStates = 0; 1466f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 14676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(long curTime) { 14680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(curTime); 14690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1470e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn if (!USE_OLD_HISTORY) { 1471e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn return; 1472e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn } 1473e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn 14746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mHaveBatteryLevel || !mRecordingHistory) { 14756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 14766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 14779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 14789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // If the current time is basically the same as the last time, 1479f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // and no states have since the last recorded entry changed and 1480f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // are now resetting back to their original value, then just collapse 1481f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // into one record. 14829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE 1483f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+2000) 1484f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn && ((mHistoryEnd.states^mHistoryCur.states)&mChangedStates) == 0) { 14859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // If the current is the same as the one before, then we no 14869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // longer need the entry. 14879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE 14881fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+500) 14899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn && mHistoryLastEnd.same(mHistoryCur)) { 14909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd.next = null; 14919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd.next = mHistoryCache; 14929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCache = mHistoryEnd; 14939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd = mHistoryLastEnd; 14949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd = null; 14959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } else { 1496f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn mChangedStates |= mHistoryEnd.states^mHistoryCur.states; 14979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, mHistoryCur); 14989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 14999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return; 15009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1502f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn mChangedStates = 0; 1503f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn 1504f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn if (mNumHistoryItems == MAX_HISTORY_ITEMS 1505f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) { 15067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn addHistoryRecordLocked(curTime, HistoryItem.CMD_OVERFLOW); 15077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 15087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 15096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mNumHistoryItems >= MAX_HISTORY_ITEMS) { 15106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // Once we've reached the maximum number of items, we only 1511f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // record changes to the battery level and the most interesting states. 1512f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn // Once we've reached the maximum maximum number of items, we only 15136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // record changes to the battery level. 15146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mHistoryEnd != null && mHistoryEnd.batteryLevel 1515f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn == mHistoryCur.batteryLevel && 1516f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS 1517f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn || ((mHistoryEnd.states^mHistoryCur.states) 1518f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn & HistoryItem.MOST_INTERESTING_STATES) == 0)) { 15196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 15206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 15216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 15229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 15236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE); 15246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 15255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 15266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(long curTime, byte cmd) { 15276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem rec = mHistoryCache; 152832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec != null) { 152932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCache = rec.next; 153032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 15316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn rec = new HistoryItem(); 153232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 15336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur); 15345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 15356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(rec); 153632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 15375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 15386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void addHistoryRecordLocked(HistoryItem rec) { 15396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mNumHistoryItems++; 154032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec.next = null; 15419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryLastEnd = mHistoryEnd; 154232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mHistoryEnd != null) { 154332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd.next = rec; 154432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd = rec; 154532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 154632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistory = mHistoryEnd = rec; 154732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 154832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 15495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 15506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void clearHistoryLocked() { 15510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "********** CLEARING HISTORY!"); 1552e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn if (USE_OLD_HISTORY) { 1553e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn if (mHistory != null) { 1554e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn mHistoryEnd.next = mHistoryCache; 1555e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn mHistoryCache = mHistory; 1556e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn mHistory = mHistoryLastEnd = mHistoryEnd = null; 1557e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn } 1558e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn mNumHistoryItems = 0; 155932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 1560e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn 15616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryBaseTime = 0; 15620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mLastHistoryTime = 0; 15630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 15640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataSize(0); 15650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 15660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER/2); 15670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL; 15680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryLastWritten.cmd = HistoryItem.CMD_NULL; 15690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBufferLastPos = -1; 15700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryOverflow = false; 157132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 15725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1573a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void doUnplugLocked(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 15741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey NetworkStats.Entry entry = null; 15751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 15761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // Track UID data usage 15771059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats uidStats = getNetworkStatsDetailGroupedByUid(); 15781059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final int size = uidStats.size(); 15791059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey for (int i = 0; i < size; i++) { 15801059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey entry = uidStats.getValues(i, entry); 15811059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 158251797ed706e6e30cddfc0c1e3a9865064f8cdd6eJeff Sharkey final Uid u = getUidStatsLocked(entry.uid); 15831059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey u.mStartedTcpBytesReceived = entry.rxBytes; 15841059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey u.mStartedTcpBytesSent = entry.txBytes; 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived; 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent; 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15881059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 1590a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mUnpluggables.get(i).unplug(elapsedRealtime, batteryUptime, batteryRealtime); 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 15931059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // Track both mobile and total overall data 15941059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats ifaceStats = getNetworkStatsSummary(); 15951059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey entry = ifaceStats.getTotal(entry, mMobileIfaces); 15961059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey doDataUnplug(mMobileDataRx, entry.rxBytes); 15971059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey doDataUnplug(mMobileDataTx, entry.txBytes); 15981059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey entry = ifaceStats.getTotal(entry); 15991059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey doDataUnplug(mTotalDataRx, entry.rxBytes); 16001059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey doDataUnplug(mTotalDataTx, entry.txBytes); 16011059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 16023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 16033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataStart = getCurrentRadioDataUptime(); 16043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = 0; 16051059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 16063f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 16073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 16083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = 0; 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 1611a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void doPlugLocked(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 16121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey NetworkStats.Entry entry = null; 16131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesReceived >= 0) { 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived(); 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesReceived = -1; 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesSent >= 0) { 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent(); 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesSent = -1; 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 1626a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mUnpluggables.get(i).plug(elapsedRealtime, batteryUptime, batteryRealtime); 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16281059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 16291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // Track both mobile and total overall data 16301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats ifaceStats = getNetworkStatsSummary(); 16311059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey entry = ifaceStats.getTotal(entry, mMobileIfaces); 16321059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey doDataPlug(mMobileDataRx, entry.rxBytes); 16331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey doDataPlug(mMobileDataTx, entry.txBytes); 16341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey entry = ifaceStats.getTotal(entry); 16351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey doDataPlug(mTotalDataRx, entry.rxBytes); 16361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey doDataPlug(mTotalDataTx, entry.txBytes); 16371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 16383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 16393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataUptime = getRadioDataUptime(); 16403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 16413f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 16423f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 16433f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = getBluetoothPingCount(); 16443f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 16479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn int mWakeLockNesting; 16489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartWakeLocked(int uid, int pid, String name, int type) { 16501ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (type == WAKE_TYPE_PARTIAL) { 16511ebccf531d1049853b3b0630035434619682c016Dianne Hackborn // Only care about partial wake locks, since full wake locks 16521ebccf531d1049853b3b0630035434619682c016Dianne Hackborn // will be canceled when the user puts the screen to sleep. 16531ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWakeLockNesting == 0) { 16541ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG; 16551ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: " 16561ebccf531d1049853b3b0630035434619682c016Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16571ebccf531d1049853b3b0630035434619682c016Dianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16581ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 16591ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mWakeLockNesting++; 16609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (uid >= 0) { 16620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { 16630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); 16640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); 16650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 16669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type); 16679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopWakeLocked(int uid, int pid, String name, int type) { 16711ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (type == WAKE_TYPE_PARTIAL) { 16721ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mWakeLockNesting--; 16731ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWakeLockNesting == 0) { 16741ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG; 16751ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: " 16761ebccf531d1049853b3b0630035434619682c016Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 16771ebccf531d1049853b3b0630035434619682c016Dianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 16781ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 16799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (uid >= 0) { 16810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { 16820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); 16830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); 16840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 16859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type); 16869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 16889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 16897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) { 16907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 16917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 16927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteStartWakeLocked(ws.get(i), pid, name, type); 16937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 16947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 16957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 16967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) { 16977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 16987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 16997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteStopWakeLocked(ws.get(i), pid, name, type); 17007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 17017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 17027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 17030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public int startAddingCpuLocked() { 17040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler.removeMessages(MSG_UPDATE_WAKELOCKS); 17050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 17060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (mScreenOn) { 17070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 17080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 17100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int N = mPartialTimers.size(); 17110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (N == 0) { 17120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.clear(); 17130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 17140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 17160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // How many timers should consume CPU? Only want to include ones 17170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // that have already been in the list. 17180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 17190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 17200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 17210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 17220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // We don't include the system UID, because it so often 17230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // holds wake locks at one request or another of an app. 17240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 17250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 50; 17260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 17300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return 0; 17310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 17330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void finishAddingCpuLocked(int perc, int utime, int stime, long[] cpuSpeedTimes) { 17340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int N = mPartialTimers.size(); 17350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (perc != 0) { 17360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn int num = 0; 17370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 17380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 17390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 17400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 17410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // We don't include the system UID, because it so often 17420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // holds wake locks at one request or another of an app. 17430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 17440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn num++; 17450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (num != 0) { 17490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 17500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 17510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (st.mInList) { 17520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = st.mUid; 17530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null && uid.mUid != Process.SYSTEM_UID) { 1754618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn int myUTime = utime/num; 1755618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn int mySTime = stime/num; 1756618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn utime -= myUTime; 1757618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn stime -= mySTime; 1758618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn num--; 17590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*"); 17600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addCpuTimeLocked(myUTime, mySTime); 17610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addSpeedStepTimes(cpuSpeedTimes); 17620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 17670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn // Just in case, collect any lost CPU time. 17680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (utime != 0 || stime != 0) { 17690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid uid = getUidStatsLocked(Process.SYSTEM_UID); 17700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (uid != null) { 17710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn Uid.Proc proc = uid.getProcessStatsLocked("*lost*"); 17720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addCpuTimeLocked(utime, stime); 17730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn proc.addSpeedStepTimes(cpuSpeedTimes); 17740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 17780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn final int NL = mLastPartialTimers.size(); 17790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn boolean diff = N != NL; 17800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL && !diff; i++) { 17810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i); 17820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn if (!diff) { 17840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL; i++) { 17850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPartialTimers.get(i).mInList = true; 17860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return; 17880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 17900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<NL; i++) { 17910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.get(i).mInList = false; 17920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.clear(); 17940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn for (int i=0; i<N; i++) { 17950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn StopwatchTimer st = mPartialTimers.get(i); 17960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn st.mInList = true; 17970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mLastPartialTimers.add(st); 17980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 17990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 18000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 18019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteProcessDiedLocked(int uid, int pid) { 18029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 18039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 18049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn u.mPids.remove(pid); 18059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 18089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public long getProcessWakeTime(int uid, int pid, long realtime) { 18099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 18109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 18119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid.Pid p = u.mPids.get(pid); 18129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p != null) { 18139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return p.mWakeSum + (p.mWakeStart != 0 ? (realtime - p.mWakeStart) : 0); 18149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return 0; 18179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 18199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) { 18209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Uid u = mUidStats.get(uid); 18219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (u != null) { 18229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn u.reportExcessiveWakeLocked(proc, overTime, usedTime); 18239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1826287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) { 1827287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Uid u = mUidStats.get(uid); 1828287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (u != null) { 1829287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn u.reportExcessiveCpuLocked(proc, overTime, usedTime); 1830287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1831287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 1832287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 18339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn int mSensorNesting; 18349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 18359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartSensorLocked(int uid, int sensor) { 18369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mSensorNesting == 0) { 18379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG; 18389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: " 18399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 18419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mSensorNesting++; 18439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStartSensor(sensor); 18449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 18469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopSensorLocked(int uid, int sensor) { 18479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mSensorNesting--; 18489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mSensorNesting == 0) { 18499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG; 18509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: " 18519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 18539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn getUidStatsLocked(uid).noteStopSensor(sensor); 18559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 18569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 185732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mGpsNesting; 18585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 18596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteStartGpsLocked(int uid) { 186032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 18616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG; 186232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: " 186332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 186532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 186632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting++; 18672e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStartGps(); 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 18706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteStopGpsLocked(int uid) { 187132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting--; 187232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 18736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG; 187432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: " 187532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 187732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 18782e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStopGps(); 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOnLocked() { 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mScreenOn) { 18836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG; 188432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " 188532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 18866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = true; 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.startRunningLocked(this); 1889617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1890617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this); 1891617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 18929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 18939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // Fake a wake lock, so we consider the device waked as long 18949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn // as the screen is on. 18951ebccf531d1049853b3b0630035434619682c016Dianne Hackborn noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); 1896c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 1897c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn // Update discharge amounts. 1898c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBatteryInternal) { 189932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateDischargeScreenLevelsLocked(false, true); 1900c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOffLocked() { 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mScreenOn) { 19066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG; 190732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: " 190832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.stopRunningLocked(this); 1912617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1913617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1914617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 19159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 19161ebccf531d1049853b3b0630035434619682c016Dianne Hackborn noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); 1917c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 1918c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn // Update discharge amounts. 1919c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBatteryInternal) { 192032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateDischargeScreenLevelsLocked(true, false); 1921c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 1922617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1923617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 19245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1925617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightnessLocked(int brightness) { 1926617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Bin the brightness. 1927617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS); 1928617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (bin < 0) bin = 0; 1929617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1; 1930617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin != bin) { 19316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK) 19326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT); 193332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: " 193432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 1936617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenOn) { 1937617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1938617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1939617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1940617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[bin].startRunningLocked(this); 1941617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1942617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessBin = bin; 1943617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1944617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 19455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 19464cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void noteInputEventAtomic() { 19474cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mInputEventCounter.stepAtomic(); 1948617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 19495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 1950617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int uid, int event) { 19512e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteUserActivityLocked(event); 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOnLocked() { 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPhoneOn) { 19563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG; 195732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: " 195832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = true; 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.startRunningLocked(this); 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOffLocked() { 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPhoneOn) { 19673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG; 196832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: " 196932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 19706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.stopRunningLocked(this); 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 197532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 19763bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn void stopAllSignalStrengthTimersLocked(int except) { 19775284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 19783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (i == except) { 19793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn continue; 19803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 19813bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) { 19823bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mPhoneSignalStrengthsTimer[i].stopRunningLocked(this); 19833bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 19843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 19853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 19863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 1987e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private int fixPhoneServiceState(int state, int signalBin) { 1988e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mPhoneSimStateRaw == TelephonyManager.SIM_STATE_ABSENT) { 1989e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // In this case we will always be STATE_OUT_OF_SERVICE, so need 1990e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // to infer that we are scanning from other data. 1991e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (state == ServiceState.STATE_OUT_OF_SERVICE 19925284090631e638b916d9a453212e9dc802656a67Wink Saville && signalBin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 1993e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn state = ServiceState.STATE_IN_SERVICE; 1994e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1995e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1996e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1997e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return state; 1998e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1999e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 2000e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn private void updateAllPhoneStateLocked(int state, int simState, int bin) { 20013bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn boolean scanning = false; 2002e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean newHistory = false; 20033bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 2004e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneServiceStateRaw = state; 2005e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSimStateRaw = simState; 2006e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthBinRaw = bin; 2007e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 2008e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (simState == TelephonyManager.SIM_STATE_ABSENT) { 2009e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // In this case we will always be STATE_OUT_OF_SERVICE, so need 2010e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // to infer that we are scanning from other data. 2011e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (state == ServiceState.STATE_OUT_OF_SERVICE 20125284090631e638b916d9a453212e9dc802656a67Wink Saville && bin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) { 2013e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn state = ServiceState.STATE_IN_SERVICE; 2014e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2015e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 20163bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 20173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If the phone is powered off, stop all timers. 20183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (state == ServiceState.STATE_POWER_OFF) { 2019e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn bin = -1; 2020f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 2021e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // If we are in service, make sure the correct signal string timer is running. 2022e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if (state == ServiceState.STATE_IN_SERVICE) { 2023e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // Bin will be changed below. 20243bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 20253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If we're out of service, we are in the lowest signal strength 20263bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // bin and have the scanning bit set. 2027f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } else if (state == ServiceState.STATE_OUT_OF_SERVICE) { 20283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn scanning = true; 20295284090631e638b916d9a453212e9dc802656a67Wink Saville bin = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 2030f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (!mPhoneSignalScanningTimer.isRunningLocked()) { 20316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG; 2032e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 20336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: " 20346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 2035f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.startRunningLocked(this); 2036f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 2037f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 20385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 20393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (!scanning) { 20403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn // If we are no longer scanning, then stop the scanning timer. 20413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (mPhoneSignalScanningTimer.isRunningLocked()) { 20423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG; 20433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: " 20443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn + Integer.toHexString(mHistoryCur.states)); 2045e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 20463bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mPhoneSignalScanningTimer.stopRunningLocked(this); 20473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 20483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 20493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 205032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mPhoneServiceState != state) { 20516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK) 20526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (state << HistoryItem.STATE_PHONE_STATE_SHIFT); 2053e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + state + " to: " 205432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 2055e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 205632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mPhoneServiceState = state; 205732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 2058e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 2059e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mPhoneSignalStrengthBin != bin) { 2060e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mPhoneSignalStrengthBin >= 0) { 2061e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this); 2062e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2063e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (bin >= 0) { 2064e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) { 2065e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 2066e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2067e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_SIGNAL_STRENGTH_MASK) 2068e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn | (bin << HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT); 2069e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: " 2070e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 2071e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn newHistory = true; 2072e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 2073e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn stopAllSignalStrengthTimersLocked(-1); 2074e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2075e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mPhoneSignalStrengthBin = bin; 2076e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2077e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 2078e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (newHistory) { 2079e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2080e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2081e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 2082e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 2083e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn /** 2084e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * Telephony stack updates the phone state. 2085e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn * @param state phone state from ServiceState.getState() 2086e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn */ 2087e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn public void notePhoneStateLocked(int state, int simState) { 2088e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn updateAllPhoneStateLocked(state, simState, mPhoneSignalStrengthBinRaw); 208932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 209032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 2091e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) { 2092627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Bin the strength. 20935284090631e638b916d9a453212e9dc802656a67Wink Saville int bin = signalStrength.getLevel(); 2094e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn updateAllPhoneStateLocked(mPhoneServiceStateRaw, mPhoneSimStateRaw, bin); 2095627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 20965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2097627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) { 2098627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin = DATA_CONNECTION_NONE; 2099627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (hasData) { 2100627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn switch (dataType) { 2101627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_EDGE: 2102627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_EDGE; 2103627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 2104627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_GPRS: 2105627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_GPRS; 2106627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 2107627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_UMTS: 2108627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_UMTS; 2109627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 21106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_CDMA: 21116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_CDMA; 21126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 21136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_0: 21146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_0; 21156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 21166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_A: 21176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_A; 21186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 21196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_1xRTT: 21206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_1xRTT; 21216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 21226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSDPA: 21236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSDPA; 21246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 21256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSUPA: 21266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSUPA; 21276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 21286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_HSPA: 21296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_HSPA; 21306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 21316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_IDEN: 21326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_IDEN; 21336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 21346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case TelephonyManager.NETWORK_TYPE_EVDO_B: 21356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn bin = DATA_CONNECTION_EVDO_B; 21366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn break; 2137962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt case TelephonyManager.NETWORK_TYPE_LTE: 2138962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt bin = DATA_CONNECTION_LTE; 2139962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt break; 2140962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt case TelephonyManager.NETWORK_TYPE_EHRPD: 2141962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt bin = DATA_CONNECTION_EHRPD; 2142962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt break; 2143627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn default: 2144627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_OTHER; 2145627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 2146627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2147627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 21483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData); 2149627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType != bin) { 21506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK) 21516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT); 215232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: " 215332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2155627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType >= 0) { 2156627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this); 2157627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2158627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionType = bin; 2159627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[bin].startRunningLocked(this); 2160627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2161627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 21625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 216358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOnLocked() { 2164105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mWifiOn) { 21656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG; 216632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: " 216732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2169105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = true; 2170105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.startRunningLocked(this); 2171105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2172105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 21735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 217458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOffLocked() { 2175105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mWifiOn) { 21766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG; 217732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: " 217832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2180105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 2181105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.stopRunningLocked(this); 2182105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2183617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 218458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked(); 2185617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = -1; 2186617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2187105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2188244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2189244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOnLocked(int uid) { 2190244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioOn) { 21916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG; 219232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: " 219332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 21946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2195244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = true; 2196244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.startRunningLocked(this); 2197244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 21982e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOnLocked(); 2199244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 22005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2201244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOffLocked(int uid) { 2202244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioOn) { 22036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; 220432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " 220532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 22066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2207244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = false; 2208244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.stopRunningLocked(this); 2209244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 22102e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOffLocked(); 2211244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2212244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2213244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOnLocked(int uid) { 2214244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoOn) { 22156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG; 221632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: " 221732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 22186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2219244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = true; 2220244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.startRunningLocked(this); 2221244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 22222e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOnLocked(); 2223244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 22245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2225244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOffLocked(int uid) { 2226244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoOn) { 22276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG; 222832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " 222932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 22306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2231244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = false; 2232244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.stopRunningLocked(this); 2233244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 22342e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOffLocked(); 2235244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2236244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2237a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOnLocked(int uid, long durationMillis) { 2238a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn getUidStatsLocked(uid).noteVibratorOnLocked(durationMillis); 2239a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2240a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2241a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOffLocked(int uid) { 2242a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn getUidStatsLocked(uid).noteVibratorOffLocked(); 2243a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2244a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 224558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningLocked(WorkSource ws) { 224658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (!mGlobalWifiRunning) { 22476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG; 224832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: " 224932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 22506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 225158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = true; 225258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.startRunningLocked(this); 225358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = ws.size(); 225458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 225558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(ws.get(i)).noteWifiRunningLocked(); 225658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 225758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 225858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running"); 2259d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2260d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2261d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 226258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) { 226358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mGlobalWifiRunning) { 226458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = oldWs.size(); 226558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 226658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked(); 226758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 226858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn N = newWs.size(); 226958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 227058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked(); 227158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 227258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 227358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running"); 227458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 227558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 227658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 227758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStoppedLocked(WorkSource ws) { 227858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mGlobalWifiRunning) { 22796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RUNNING_FLAG; 228032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: " 228132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 22826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 228358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 228458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.stopRunningLocked(this); 228558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int N = ws.size(); 228658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 228758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked(); 228858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 228958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 229058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running"); 2291d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2292d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2293d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 2294105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOnLocked() { 2295105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mBluetoothOn) { 22966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG; 229732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: " 229832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 22996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2300105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = true; 2301105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.startRunningLocked(this); 2302105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2303105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 23045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2305105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOffLocked() { 2306105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mBluetoothOn) { 23076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG; 230832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: " 230932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 23106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 2311105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 2312105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.stopRunningLocked(this); 2313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2314105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 23155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 231632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiFullLockNesting = 0; 23175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2318105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked(int uid) { 231932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 23206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; 232132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: " 232232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 23236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 232432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 232532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting++; 23262e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked(); 2327105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2328105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2329105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked(int uid) { 233032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting--; 233132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 23326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; 233332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: " 233432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 23356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 233632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 23372e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockReleasedLocked(); 2338105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2339105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 23406ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly int mWifiScanNesting = 0; 23415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23426ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedLocked(int uid) { 23436ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (mWifiScanNesting == 0) { 23446ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_FLAG; 23456ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan started for: " 234632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 23476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 234832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 23496ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanNesting++; 23506ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly getUidStatsLocked(uid).noteWifiScanStartedLocked(); 2351105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2352105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 23536ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedLocked(int uid) { 23546ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanNesting--; 23556ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (mWifiScanNesting == 0) { 23566ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_FLAG; 23576ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan stopped for: " 235832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 23596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 236032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 23616ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly getUidStatsLocked(uid).noteWifiScanStoppedLocked(); 2362105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 23635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 236432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiMulticastNesting = 0; 23655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 23665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked(int uid) { 236732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 23686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; 236932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: " 237032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 23716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 237232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 237332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting++; 23742e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastEnabledLocked(); 23755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 23765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 23775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked(int uid) { 237832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting--; 237932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 23806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; 238132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: " 238232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 23836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 238432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 23852e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastDisabledLocked(); 23865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 23875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 23887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) { 23897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 23907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 23917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteFullWifiLockAcquiredLocked(ws.get(i)); 23927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 23937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 23947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 23957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) { 23967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 23977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 23987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteFullWifiLockReleasedLocked(ws.get(i)); 23997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 24026ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedFromSourceLocked(WorkSource ws) { 24037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 24047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 24056ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly noteWifiScanStartedLocked(ws.get(i)); 24067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 24096ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedFromSourceLocked(WorkSource ws) { 24107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 24117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 24126ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly noteWifiScanStoppedLocked(ws.get(i)); 24137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 24167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) { 24177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 24187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 24197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteWifiMulticastEnabledLocked(ws.get(i)); 24207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 24237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) { 24247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int N = ws.size(); 24257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn for (int i=0; i<N; i++) { 24267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn noteWifiMulticastDisabledLocked(ws.get(i)); 24277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 24301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public void noteNetworkInterfaceTypeLocked(String iface, int networkType) { 24311059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (ConnectivityManager.isNetworkTypeMobile(networkType)) { 24321059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey mMobileIfaces.add(iface); 24331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } else { 24341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey mMobileIfaces.remove(iface); 24351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 24361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 24371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getScreenOnTime(long batteryRealtime, int which) { 2439c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which); 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2442617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public long getScreenBrightnessTime(int brightnessBin, 2443617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long batteryRealtime, int which) { 2444c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked( 2445617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn batteryRealtime, which); 2446617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2447244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2448617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getInputEventCount(int which) { 2449c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mInputEventCounter.getCountLocked(which); 2450617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 24515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getPhoneOnTime(long batteryRealtime, int which) { 2453c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which); 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2455244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 2456627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneSignalStrengthTime(int strengthBin, 2457627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 2458c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked( 2459627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 2460627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2461f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 2462f37447bad3773b62176baa837908daf6edb44273Amith Yamasani @Override public long getPhoneSignalScanningTime( 2463f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long batteryRealtime, int which) { 2464f37447bad3773b62176baa837908daf6edb44273Amith Yamasani return mPhoneSignalScanningTimer.getTotalTimeLocked( 2465f37447bad3773b62176baa837908daf6edb44273Amith Yamasani batteryRealtime, which); 2466f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 2467f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 2468fb900813511df0706469ad340bfb0810b5a12cd7Catherine Liu @Override public int getPhoneSignalStrengthCount(int strengthBin, int which) { 2469fb900813511df0706469ad340bfb0810b5a12cd7Catherine Liu return mPhoneSignalStrengthsTimer[strengthBin].getCountLocked(which); 2470617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 24715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2472627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneDataConnectionTime(int dataType, 2473627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 2474c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked( 2475627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 2476627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 24775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2478617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneDataConnectionCount(int dataType, int which) { 2479c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 2480617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 24815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2482105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getWifiOnTime(long batteryRealtime, int which) { 2483c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which); 2484105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 248658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) { 248758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 2488d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 2489d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 2490105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getBluetoothOnTime(long batteryRealtime, int which) { 2491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which); 2492105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 24935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean getIsOnBattery() { 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() { 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUidStats; 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular uid. 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Uid extends BatteryStats.Uid { 25065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mUid; 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesReceived; 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesSent; 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesReceived; 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesSent; 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesReceivedAtLastUnplug; 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesSentAtLastUnplug; 25145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are not saved/restored when parcelling, since we want 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to return from the parcel with a snapshot of the state. 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesReceived = -1; 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesSent = -1; 25195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 252058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn boolean mWifiRunning; 252158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn StopwatchTimer mWifiRunningTimer; 25225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2523105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mFullWifiLockOut; 2524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mFullWifiLockTimer; 25255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 25266ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly boolean mWifiScanStarted; 25276ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly StopwatchTimer mWifiScanTimer; 25285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 25295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt boolean mWifiMulticastEnabled; 25305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt StopwatchTimer mWifiMulticastTimer; 25315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2532244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioTurnedOn; 2533244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioTurnedOnTimer; 25345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2535244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoTurnedOn; 2536244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoTurnedOnTimer; 25375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2538a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn BatchTimer mVibratorOnTimer; 2539a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2540617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter[] mUserActivityCounters; 25415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's wake locks. 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>(); 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's sensor activations. 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>(); 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>(); 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>(); 25615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 25629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn /** 25639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn * The transient wake stats we have collected for this uid's pids. 25649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn */ 25659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn final SparseArray<Pid> mPids = new SparseArray<Pid>(); 25669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid(int uid) { 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUid = uid; 256958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 257058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables); 25710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 257258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables); 25736ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN, 25746ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimers, mUnpluggables); 25750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 257658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables); 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() { 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWakelockStats; 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() { 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSensorStats; 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() { 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProcessStats; 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() { 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageStats; 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2598eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2599eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getUid() { 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUid; 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2603eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2604eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesReceived(int which) { 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesReceived; 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesReceived(); 26106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesReceivedAtLastUnplug; 26126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesReceived; 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesReceived() { 26201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final long uidRxBytes = getNetworkStatsDetailGroupedByUid().getTotal( 26211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey null, mUid).rxBytes; 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0 26231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey ? (uidRxBytes - mStartedTcpBytesReceived) : 0); 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2625eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2626eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesSent(int which) { 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesSent; 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesSent(); 26326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesSentAtLastUnplug; 26346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesSent; 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2641105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 264258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningLocked() { 264358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (!mWifiRunning) { 264458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = true; 264558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer == null) { 264658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 264758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables); 26486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 264958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this); 2650617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2651617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 26525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2653617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 265458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStoppedLocked() { 265558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunning) { 265658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = false; 265758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this); 2658617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2659617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 26605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2661617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2662105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked() { 2663105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mFullWifiLockOut) { 2664105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = true; 26656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer == null) { 26660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 266758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables); 26686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2669105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 2670105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2671105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 26725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2673105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2674105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked() { 2675105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mFullWifiLockOut) { 2676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 2677105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 2678105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2679105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 26805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2681105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 26826ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedLocked() { 26836ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (!mWifiScanStarted) { 26846ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanStarted = true; 26856ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (mWifiScanTimer == null) { 26866ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN, 26876ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimers, mUnpluggables); 26886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 26896ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimer.startRunningLocked(BatteryStatsImpl.this); 2690105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2691105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 26925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2693105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 26946ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedLocked() { 26956ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (mWifiScanStarted) { 26966ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanStarted = false; 26976ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimer.stopRunningLocked(BatteryStatsImpl.this); 2698105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2699105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 27005347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 27015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 27025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked() { 27035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (!mWifiMulticastEnabled) { 27045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = true; 27056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer == null) { 27060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 270758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables); 27086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this); 27105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 27115347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 27125347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 27135347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 27145347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked() { 27155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (mWifiMulticastEnabled) { 27165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 27175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this); 27185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 27195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 27205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2721a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public StopwatchTimer createAudioTurnedOnTimerLocked() { 2722a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mAudioTurnedOnTimer == null) { 2723a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 2724a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn null, mUnpluggables); 2725a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2726a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mAudioTurnedOnTimer; 2727a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2728a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 27296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 27306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteAudioTurnedOnLocked() { 27316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mAudioTurnedOn) { 27326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = true; 2733a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn createAudioTurnedOnTimerLocked().startRunningLocked(BatteryStatsImpl.this); 27346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2735617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2736244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 27376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteAudioTurnedOffLocked() { 27396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOn) { 27406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = false; 2741a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mAudioTurnedOnTimer != null) { 2742a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 2743a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2744a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2745a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2746a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2747a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public StopwatchTimer createVideoTurnedOnTimerLocked() { 2748a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mVideoTurnedOnTimer == null) { 2749a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 2750a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn null, mUnpluggables); 27516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2752a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mVideoTurnedOnTimer; 27536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 27556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 27566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteVideoTurnedOnLocked() { 27576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!mVideoTurnedOn) { 27586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = true; 2759a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn createVideoTurnedOnTimerLocked().startRunningLocked(BatteryStatsImpl.this); 27606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 27626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 27636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn @Override 27646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void noteVideoTurnedOffLocked() { 27656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOn) { 27666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = false; 2767a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mVideoTurnedOnTimer != null) { 2768a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 2769a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2770a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2771a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2772a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2773a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public BatchTimer createVibratorOnTimerLocked() { 2774a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mVibratorOnTimer == null) { 2775a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVibratorOnTimer = new BatchTimer(Uid.this, VIBRATOR_ON, 2776a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mUnpluggables, BatteryStatsImpl.this.mOnBatteryInternal); 2777a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2778a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mVibratorOnTimer; 2779a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2780a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2781a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOnLocked(long durationMillis) { 2782a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn createVibratorOnTimerLocked().addDuration(BatteryStatsImpl.this, durationMillis); 2783a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2784a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2785a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOffLocked() { 2786a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mVibratorOnTimer != null) { 2787a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVibratorOnTimer.abortLastDuration(BatteryStatsImpl.this); 27886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2789244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2790244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 27915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 279258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public long getWifiRunningTime(long batteryRealtime, int which) { 279358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer == null) { 27946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 27956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 279658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 2797244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 2798244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 27995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 2800105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getFullWifiLockTime(long batteryRealtime, int which) { 28016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer == null) { 28026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 28036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 2805105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 28065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 28075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 28086ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public long getWifiScanTime(long batteryRealtime, int which) { 28096ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (mWifiScanTimer == null) { 28106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 28116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28126ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly return mWifiScanTimer.getTotalTimeLocked(batteryRealtime, which); 2813105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 28145347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 28155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 28165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public long getWifiMulticastTime(long batteryRealtime, int which) { 28176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer == null) { 28186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 28196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime, 28215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt which); 28225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 28235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 28245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 28256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public long getAudioTurnedOnTime(long batteryRealtime, int which) { 28266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer == null) { 28276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 28286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 28306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 28325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @Override 28336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public long getVideoTurnedOnTime(long batteryRealtime, int which) { 28346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer == null) { 28356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return 0; 28366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 28386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 2840617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2841a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public Timer getVibratorOnTimer() { 2842a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mVibratorOnTimer; 2843a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2844a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2845a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn @Override 2846617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int type) { 2847617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 2848617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn initUserActivityLocked(); 2849617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2850df693de4fe12f081555b449e2726e205fbd86572Jeff Brown if (type >= 0 && type < NUM_USER_ACTIVITY_TYPES) { 2851df693de4fe12f081555b449e2726e205fbd86572Jeff Brown mUserActivityCounters[type].stepAtomic(); 2852df693de4fe12f081555b449e2726e205fbd86572Jeff Brown } else { 2853df693de4fe12f081555b449e2726e205fbd86572Jeff Brown Slog.w(TAG, "Unknown user activity type " + type + " was specified.", 2854df693de4fe12f081555b449e2726e205fbd86572Jeff Brown new Throwable()); 2855df693de4fe12f081555b449e2726e205fbd86572Jeff Brown } 2856617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 28575a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2858617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2859617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public boolean hasUserActivity() { 2860617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return mUserActivityCounters != null; 2861617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 28625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2863617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 2864617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public int getUserActivityCount(int type, int which) { 2865617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 2866617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return 0; 2867617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUserActivityCounters[type].getCountLocked(which); 2869617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 28705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 2871617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void initUserActivityLocked() { 2872617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 2873617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2874617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables); 2875617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2876617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 28775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesSent() { 28791059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final long uidTxBytes = getNetworkStatsDetailGroupedByUid().getTotal( 28801059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey null, mUid).txBytes; 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0 28821059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey ? (uidTxBytes - mStartedTcpBytesSent) : 0); 28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2884244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 28856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn /** 28866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * Clear all stats for this uid. Returns true if the uid is completely 28876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn * inactive so can be dropped. 28886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn */ 28896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 28906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean active = false; 28915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 289258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 289358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false); 289458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn active |= mWifiRunning; 28956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 28966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 28979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false); 28986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mFullWifiLockOut; 28996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29006ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (mWifiScanTimer != null) { 29016ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly active |= !mWifiScanTimer.reset(BatteryStatsImpl.this, false); 29026ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly active |= mWifiScanStarted; 29036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 29059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false); 29066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mWifiMulticastEnabled; 29076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 29099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false); 29106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mAudioTurnedOn; 29116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 29139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false); 29146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active |= mVideoTurnedOn; 29156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 2916a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mVibratorOnTimer != null) { 2917a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mVibratorOnTimer.reset(BatteryStatsImpl.this, false)) { 2918a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVibratorOnTimer.detach(); 2919a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVibratorOnTimer = null; 2920a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } else { 2921a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn active = true; 2922a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 2923a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 29245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 29256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0; 29266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0; 29275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 29286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 29296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 29306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters[i].reset(false); 29316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 29346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWakelockStats.size() > 0) { 29356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator(); 29366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 29376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Wakelock> wakelockEntry = it.next(); 29386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Wakelock wl = wakelockEntry.getValue(); 29396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (wl.reset()) { 29406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn it.remove(); 29416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 29426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active = true; 29436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mSensorStats.size() > 0) { 29476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator(); 29486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 29496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<Integer, Sensor> sensorEntry = it.next(); 29506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Sensor s = sensorEntry.getValue(); 29516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (s.reset()) { 29526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn it.remove(); 29536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 29546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn active = true; 29556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mProcessStats.size() > 0) { 29596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator(); 29606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 29616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Proc> procEntry = it.next(); 29626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn procEntry.getValue().detach(); 29636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mProcessStats.clear(); 29656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mPids.size() > 0) { 29679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; !active && i<mPids.size(); i++) { 29689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid pid = mPids.valueAt(i); 29699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (pid.mWakeStart != 0) { 29709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn active = true; 29719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 29729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 29739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 29746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mPackageStats.size() > 0) { 29756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator(); 29766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it.hasNext()) { 29776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Pkg> pkgEntry = it.next(); 29786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Pkg p = pkgEntry.getValue(); 29796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn p.detach(); 29806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (p.mServiceStats.size() > 0) { 29816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Iterator<Map.Entry<String, Pkg.Serv>> it2 29826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn = p.mServiceStats.entrySet().iterator(); 29836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn while (it2.hasNext()) { 29846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn Map.Entry<String, Pkg.Serv> servEntry = it2.next(); 29856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn servEntry.getValue().detach(); 29866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mPackageStats.clear(); 29906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 29929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPids.clear(); 29939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 29946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!active) { 299558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 299658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.detach(); 29976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 29986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 29996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer.detach(); 30006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30016ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (mWifiScanTimer != null) { 30026ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimer.detach(); 30036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 30056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer.detach(); 30066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 30086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.detach(); 3009a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mAudioTurnedOnTimer = null; 30106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 30126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.detach(); 3013a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVideoTurnedOnTimer = null; 30146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 30166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 30176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters[i].detach(); 30186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 30226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return !active; 30236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakelockStats.size()); 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) { 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(wakelockEntry.getKey()); 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = wakelockEntry.getValue(); 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.writeToParcelLocked(out, batteryRealtime); 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mSensorStats.size()); 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) { 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(sensorEntry.getKey()); 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = sensorEntry.getValue(); 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.writeToParcelLocked(out, batteryRealtime); 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mProcessStats.size()); 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) { 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(procEntry.getKey()); 30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = procEntry.getValue(); 30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.writeToParcelLocked(out); 30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mPackageStats.size()); 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) { 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(pkgEntry.getKey()); 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = pkgEntry.getValue(); 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.writeToParcelLocked(out); 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesReceived); 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesSent); 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesReceived()); 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesSent()); 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesReceivedAtLastUnplug); 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesSentAtLastUnplug); 306058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (mWifiRunningTimer != null) { 30616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 306258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer.writeToParcel(out, batteryRealtime); 30636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 3064617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 30656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mFullWifiLockTimer != null) { 30676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 30686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer.writeToParcel(out, batteryRealtime); 3069617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 30706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 30716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30726ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (mWifiScanTimer != null) { 30736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 30746ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimer.writeToParcel(out, batteryRealtime); 30756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 30766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 30776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mWifiMulticastTimer != null) { 30796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 30806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer.writeToParcel(out, batteryRealtime); 30816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 30826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 30836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mAudioTurnedOnTimer != null) { 30856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 30866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime); 30876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 30886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 30896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 30906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mVideoTurnedOnTimer != null) { 30916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 30926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime); 30936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 30946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 30956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3096a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mVibratorOnTimer != null) { 3097a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn out.writeInt(1); 3098a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVibratorOnTimer.writeToParcel(out, batteryRealtime); 3099a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } else { 3100a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn out.writeInt(0); 3101a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 31026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUserActivityCounters != null) { 3103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 3104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 3105617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i].writeToParcel(out); 3106617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 31076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 31086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 3109617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numWakelocks = in.readInt(); 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.clear(); 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < numWakelocks; j++) { 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wakelockName = in.readString(); 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = new Wakelock(); 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.readFromParcelLocked(unpluggables, in); 3119c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn // We will just drop some random set of wakelocks if 3120c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn // the previous run of the system was an older version 3121c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn // that didn't impose a limit. 3122c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn mWakelockStats.put(wakelockName, wakelock); 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numSensors = in.readInt(); 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.clear(); 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numSensors; k++) { 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = in.readInt(); 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = new Sensor(sensorNumber); 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.readFromParcelLocked(mUnpluggables, in); 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensorNumber, sensor); 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numProcs = in.readInt(); 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.clear(); 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numProcs; k++) { 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String processName = in.readString(); 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = new Proc(); 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.readFromParcelLocked(in); 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(processName, proc); 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numPkgs = in.readInt(); 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.clear(); 31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int l = 0; l < numPkgs; l++) { 31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = in.readString(); 31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = new Pkg(); 31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.readFromParcelLocked(in); 31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(packageName, pkg); 31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesReceived = in.readLong(); 31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesSent = in.readLong(); 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesReceived = in.readLong(); 31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesSent = in.readLong(); 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesReceivedAtLastUnplug = in.readLong(); 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesSentAtLastUnplug = in.readLong(); 315858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunning = false; 31596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 316058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING, 316158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers, mUnpluggables, in); 31626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 316358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimer = null; 31646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3165105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 31666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 31670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK, 316858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers, mUnpluggables, in); 31696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 31706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mFullWifiLockTimer = null; 31716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31726ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanStarted = false; 31736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 31746ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN, 31756ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimers, mUnpluggables, in); 31766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 31776ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimer = null; 31786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 31806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 31810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED, 318258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers, mUnpluggables, in); 3183617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 31846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mWifiMulticastTimer = null; 31856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOn = false; 31876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 31880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON, 31896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables, in); 31906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 31916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mAudioTurnedOnTimer = null; 31926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 31936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOn = false; 31946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 31950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON, 31966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn null, mUnpluggables, in); 31976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 31986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mVideoTurnedOnTimer = null; 31996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 3201a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVibratorOnTimer = new BatchTimer(Uid.this, VIBRATOR_ON, 3202a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mUnpluggables, BatteryStatsImpl.this.mOnBatteryInternal, in); 3203a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } else { 3204a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mVibratorOnTimer = null; 3205a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 3206a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (in.readInt() != 0) { 3207617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 3208617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 3209617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables, in); 3210617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 32116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 32126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUserActivityCounters = null; 3213617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular wake lock. 32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Wakelock extends BatteryStats.Uid.Wakelock { 32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device partially awake. 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3223c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerPartial; 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device fully awake. 32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3228c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerFull; 32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has had a window keeping the device awake. 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3233c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerWindow; 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a possibly null Timer from a Parcel. The timer is associated with the 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proper timer pool from the given BatteryStatsImpl object. 32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in the Parcel to be read from. 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return a new Timer, or null. 32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3242c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool, 32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<Unpluggable> unpluggables, Parcel in) { 32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return new StopwatchTimer(Uid.this, type, pool, unpluggables, in); 32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 32526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean wlactive = false; 32536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerFull != null) { 32549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false); 32556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPartial != null) { 32579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false); 32586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerWindow != null) { 32609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false); 32616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (!wlactive) { 32636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerFull != null) { 32646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerFull.detach(); 32656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerFull = null; 32666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerPartial != null) { 32686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPartial.detach(); 32696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerPartial = null; 32706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mTimerWindow != null) { 32726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerWindow.detach(); 32736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimerWindow = null; 32746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return !wlactive; 32776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 32785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers, unpluggables, in); 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, 32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers, unpluggables, in); 32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers, unpluggables, in); 32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime); 32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime); 32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime); 32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getWakeTime(int type) { 32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: return mTimerFull; 32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: return mTimerPartial; 32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: return mTimerWindow; 33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: throw new IllegalArgumentException("type = " + type); 33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Sensor extends BatteryStats.Uid.Sensor { 33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mHandle; 3307c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimer; 33085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Sensor(int handle) { 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandle = handle; 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3313c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables, 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in) { 33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle); 33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool == null) { 3321c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pool = new ArrayList<StopwatchTimer>(); 33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(mHandle, pool); 33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in); 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn boolean reset() { 33289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mTimer.reset(BatteryStatsImpl.this, true)) { 33296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTimer = null; 33306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return true; 33316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 33326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return false; 33336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 33345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimer = readTimerFromParcel(unpluggables, in); 33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimer, batteryRealtime); 33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getSensorTime() { 33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTimer; 33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3347eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3348eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHandle() { 33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHandle; 33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable { 33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in user code. 33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUserTime; 33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in kernel code. 33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSystemTime; 33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times the process has been started. 33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3374eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Amount of time the process was running in the foreground. 3375eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3376eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mForegroundTime; 3377eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3378eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from a previous save. 33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedUserTime; 33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from a previous save. 33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedSystemTime; 33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from a previous save. 33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3394eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from a previous save. 3395eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3396eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLoadedForegroundTime; 3397eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3398eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from the previous run. 34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUserTime; 34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from the previous run. 34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastSystemTime; 34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from the previous run. 34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3414eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from the previous run 3415eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3416eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLastForegroundTime; 3417eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3418eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time when last unplugged. 34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedUserTime; 34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time when last unplugged. 34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedSystemTime; 34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started before unplugged. 34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3433eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 3434eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time since unplugged. 3435eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 3436eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mUnpluggedForegroundTime; 3437eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3438e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter[] mSpeedBins; 3439e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3440287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ArrayList<ExcessivePower> mExcessivePower; 34419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc() { 34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 3444e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mSpeedBins = new SamplingCounter[getCpuSpeedSteps()]; 34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3446e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3447a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void unplug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = mUserTime; 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = mSystemTime; 34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 3451eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = mForegroundTime; 34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3454a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 34576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 34586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 34596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i = 0; i < mSpeedBins.length; i++) { 34606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 34616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c != null) { 34626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(c); 34636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = null; 34646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 34656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 34666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 34675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3468287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public int countExcessivePowers() { 3469287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mExcessivePower != null ? mExcessivePower.size() : 0; 34709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 34719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3472287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public ExcessivePower getExcessivePower(int i) { 3473287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower != null) { 3474287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mExcessivePower.get(i); 34759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 34769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return null; 34779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 34789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 34799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void addExcessiveWake(long overTime, long usedTime) { 3480287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 3481287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 34829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 3483287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3484287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = ExcessivePower.TYPE_WAKE; 34859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.overTime = overTime; 34869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.usedTime = usedTime; 3487287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 34889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 34899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3490287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void addExcessiveCpu(long overTime, long usedTime) { 3491287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 3492287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 3493287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3494287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3495287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = ExcessivePower.TYPE_CPU; 3496287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.overTime = overTime; 3497287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.usedTime = usedTime; 3498287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 3499287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3500287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 3501287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn void writeExcessivePowerToParcelLocked(Parcel out) { 3502287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mExcessivePower == null) { 35039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeInt(0); 35049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return; 35059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 35069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3507287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final int N = mExcessivePower.size(); 35089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeInt(N); 35099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; i<N; i++) { 3510287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = mExcessivePower.get(i); 3511287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn out.writeInt(ew.type); 35129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeLong(ew.overTime); 35139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn out.writeLong(ew.usedTime); 35149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 35159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 35169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 35177b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn boolean readExcessivePowerFromParcelLocked(Parcel in) { 35189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn final int N = in.readInt(); 35199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (N == 0) { 3520287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = null; 35217b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return true; 35229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 35239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 35247b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (N > 10000) { 35257b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn Slog.w(TAG, "File corrupt: too many excessive power entries " + N); 35267b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return false; 35277b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 35287b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn 3529287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower = new ArrayList<ExcessivePower>(); 35309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn for (int i=0; i<N; i++) { 3531287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ExcessivePower ew = new ExcessivePower(); 3532287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ew.type = in.readInt(); 35339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.overTime = in.readLong(); 35349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn ew.usedTime = in.readLong(); 3535287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mExcessivePower.add(ew); 35369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 35377b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return true; 35389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 35399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUserTime); 35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mSystemTime); 3543eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mForegroundTime); 35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedUserTime); 35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedSystemTime); 3547eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mLoadedForegroundTime); 35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedUserTime); 35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedSystemTime); 3551eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mUnpluggedForegroundTime); 35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 3553e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3554e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(mSpeedBins.length); 3555e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length; i++) { 35566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 35576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c != null) { 35586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 35596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn c.writeToParcel(out); 35606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 35616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 35626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3563e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 35649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3565287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn writeExcessivePowerToParcelLocked(out); 35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime = in.readLong(); 35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime = in.readLong(); 3571eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime = in.readLong(); 35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedUserTime = in.readLong(); 35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedSystemTime = in.readLong(); 3575eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mLoadedForegroundTime = in.readLong(); 35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 35773bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastUserTime = 0; 35783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastSystemTime = 0; 35793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastForegroundTime = 0; 35803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStarts = 0; 35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = in.readLong(); 35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = in.readLong(); 3583eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = in.readLong(); 35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 3585e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3586e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani int bins = in.readInt(); 35876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int steps = getCpuSpeedSteps(); 35886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps]; 3589e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < bins; i++) { 35906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 35916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = new SamplingCounter(mUnpluggables, in); 35926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3593e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 35949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 3595287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn readExcessivePowerFromParcelLocked(in); 35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCpuTimeLocked(int utime, int stime) { 36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime += utime; 36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime += stime; 36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3607eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public void addForegroundTimeLocked(long ttime) { 3608eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime += ttime; 3609eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3610eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incStartsLocked() { 36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getUserTime(int which) { 36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastUserTime; 36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mUserTime; 36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedUserTime; 36246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedUserTime; 36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSystemTime(int which) { 36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastSystemTime; 36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mSystemTime; 36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedSystemTime; 36406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedSystemTime; 36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3648eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public long getForegroundTime(int which) { 3649eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long val; 3650eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_LAST) { 3651eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mLastForegroundTime; 3652eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } else { 3653eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mForegroundTime; 3654eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_CURRENT) { 3655eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mLoadedForegroundTime; 36566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 3657eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mUnpluggedForegroundTime; 3658eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3659eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3660eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani return val; 3661eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 3662eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 3663eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 36726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3678e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3679e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /* Called by ActivityManagerService when CPU times are updated. */ 3680e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void addSpeedStepTimes(long[] values) { 3681e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length && i < values.length; i++) { 36826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn long amt = values[i]; 36836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (amt != 0) { 36846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[i]; 36856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (c == null) { 36866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mSpeedBins[i] = c = new SamplingCounter(mUnpluggables); 36876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 36886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn c.addCountAtomic(values[i]); 36896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 3690e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3691e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3692e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3693e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 3694e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public long getTimeAtCpuSpeedStep(int speedStep, int which) { 3695e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (speedStep < mSpeedBins.length) { 36966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn SamplingCounter c = mSpeedBins[speedStep]; 36976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return c != null ? c.getCountLocked(which) : 0; 3698e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } else { 3699e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return 0; 3700e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3701e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable { 37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times this package has done something that could wake up the 37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mWakeups; 37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device loaded from a 37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous save. 37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedWakeups; 37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastWakeups; 37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedWakeups; 37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statics we have collected for this package's services. 37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>(); 37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg() { 37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3741a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void unplug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = mWakeups; 37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3745a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 37486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 37496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 37506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 37515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups = in.readInt(); 37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedWakeups = in.readInt(); 37553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastWakeups = 0; 37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = in.readInt(); 37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numServs = in.readInt(); 37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.clear(); 37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int m = 0; m < numServs; m++) { 37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String serviceName = in.readString(); 37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = new Serv(); 37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.put(serviceName, serv); 37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.readFromParcelLocked(in); 37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakeups); 37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedWakeups); 37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedWakeups); 37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mServiceStats.size()); 37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) { 37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(servEntry.getKey()); 37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = servEntry.getValue(); 37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.writeToParcelLocked(out); 37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() { 37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServiceStats; 37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWakeups(int which) { 37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastWakeups; 37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mWakeups; 37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedWakeups; 37976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedWakeups; 37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable { 38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left started. 38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartTime; 38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been started and not yet stopped, this is 38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started. 38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRunningSince; 38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently running. 38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning; 38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number of times startService() has been called. 38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left launched. 38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedTime; 38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been launched and not yet exited, this is 38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was launched (ms in battery uptime). 38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedSince; 38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently launched. 38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLaunched; 38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number times the service has been launched. 38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLaunches; 38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started loaded from a previous save 38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (ms in battery uptime). 38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedStartTime; 38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts loaded from a previous save. 38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches loaded from a previous save. 38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedLaunches; 38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started as of the last run (ms 38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastStartTime; 38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts as of the last run. 38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches as of the last run. 38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastLaunches; 38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started when last unplugged (ms 38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedStartTime; 38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts when last unplugged. 38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches when last unplugged. 38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedLaunches; 38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Serv() { 39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 3903a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void unplug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime); 39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = mLaunches; 39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void plug(long elapsedRealtime, long batteryUptime, long batteryRealtime) { 39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 39126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void detach() { 39136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(this); 39146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 39155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime = in.readLong(); 39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = in.readLong(); 39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = in.readInt() != 0; 39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime = in.readLong(); 39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = in.readLong(); 39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = in.readInt() != 0; 39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches = in.readInt(); 39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStartTime = in.readLong(); 39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedLaunches = in.readInt(); 39283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStartTime = 0; 39293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastStarts = 0; 39303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastLaunches = 0; 39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = in.readLong(); 39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = in.readInt(); 39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mStartTime); 39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRunningSince); 39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mRunning ? 1 : 0); 39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedTime); 39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedSince); 39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunched ? 1 : 0); 39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunches); 39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedStartTime); 39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedLaunches); 39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedStartTime); 39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedLaunches); 39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getLaunchTimeToNowLocked(long batteryUptime) { 39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) return mLaunchedTime; 39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLaunchedTime + batteryUptime - mLaunchedSince; 39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getStartTimeToNowLocked(long batteryUptime) { 39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) return mStartTime; 39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartTime + batteryUptime - mRunningSince; 39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLaunchedLocked() { 39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) { 39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches++; 39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = getBatteryUptimeLocked(); 39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = true; 39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopLaunchedLocked() { 39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLaunched) { 39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mLaunchedSince; 39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime += time; 39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches--; 39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = false; 39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startRunningLocked() { 39849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) { 39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = getBatteryUptimeLocked(); 39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 39889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopRunningLocked() { 39929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRunning) { 39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mRunningSince; 39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime += time; 39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts--; 39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = false; 40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLaunches(int which) { 40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastLaunches; 40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLaunches; 40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedLaunches; 40176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedLaunches; 40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getStartTime(long now, int which) { 40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStartTime; 40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = getStartTimeToNowLocked(now); 40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStartTime; 40346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStartTime; 40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 40516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_UNPLUGGED) { 40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incWakeupsLocked() { 40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups++; 40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Serv newServiceStatsLocked() { 40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Serv(); 40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Proc getProcessStatsLocked(String name) { 40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc ps = mProcessStats.get(name); 40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Proc(); 40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(name, ps); 40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 40859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4087b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public SparseArray<? extends Pid> getPidStats() { 4088b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn return mPids; 4089b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 40905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 40919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public Pid getPidStatsLocked(int pid) { 40929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = mPids.get(pid); 40939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p == null) { 40949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p = new Pid(); 40959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPids.put(pid, p); 40969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 40979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return p; 40989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 40999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 41009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg getPackageStatsLocked(String name) { 41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = mPackageStats.get(name); 41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Pkg(); 41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(name, ps); 41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 41129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 41189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg.Serv getServiceStatsLocked(String pkg, String serv) { 41199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = getPackageStatsLocked(pkg); 41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg.Serv ss = ps.mServiceStats.get(serv); 41219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ss == null) { 41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss = ps.newServiceStatsLocked(); 41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps.mServiceStats.put(serv, ss); 41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getWakeTimerLocked(String name, int type) { 41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Wakelock wl = mWakelockStats.get(name); 41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl == null) { 4132c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn final int N = mWakelockStats.size(); 4133af17baa27196e785989e99b0ecbe7f1c98a1f0cbDianne Hackborn if (N > MAX_WAKELOCKS_PER_UID) { 41349e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn name = BATCHED_WAKELOCK_NAME; 41359e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = mWakelockStats.get(name); 41369e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 41379e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (wl == null) { 41389e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = new Wakelock(); 41399e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn mWakelockStats.put(name, wl); 41409e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4142c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = null; 41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 41449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: 41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerPartial; 41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 41470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL, 41480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPartialTimers, mUnpluggables); 41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial = t; 41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: 41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerFull; 41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 41550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL, 41560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mFullTimers, mUnpluggables); 41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull = t; 41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 41609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: 41619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerWindow; 41629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 41630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW, 41640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWindowTimers, mUnpluggables); 41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow = t; 41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("type=" + type); 41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4173c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) { 41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sensor se = mSensorStats.get(sensor); 41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se == null) { 41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!create) { 41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se = new Sensor(sensor); 41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensor, se); 41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4182c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = se.mTimer; 41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4186c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor); 41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timers == null) { 4188c64edde69d18498fb2954f71a546357b07ab996aEvan Millar timers = new ArrayList<StopwatchTimer>(); 41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(sensor, timers); 41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables); 41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer = t; 41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartWakeLocked(int pid, String name, int type) { 4197c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42011ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { 42029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = getPidStatsLocked(pid); 4203b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn if (p.mWakeStart == 0) { 4204b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn p.mWakeStart = SystemClock.elapsedRealtime(); 4205b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn } 42069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 42079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopWakeLocked(int pid, String name, int type) { 4210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42141ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { 42159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Pid p = mPids.get(pid); 4216b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn if (p != null && p.mWakeStart != 0) { 42179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart; 42189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.mWakeStart = 0; 42199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 42209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 42219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 42229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 42239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) { 42249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn Proc p = getProcessStatsLocked(proc); 42259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (p != null) { 42269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn p.addExcessiveWake(overTime, usedTime); 42279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4230287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) { 4231287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Proc p = getProcessStatsLocked(proc); 4232287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (p != null) { 4233287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn p.addExcessiveCpu(overTime, usedTime); 4234287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 4235287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 4236287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int sensor) { 4238c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, true); 42399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 42415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh } 42429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int sensor) { 42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't create a timer if one doesn't already exist 4246c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, false); 42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 42495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh } 42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 42529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps() { 4253c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true); 42549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 42559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 42565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh } 42579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 42599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps() { 4260c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false); 42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 4263244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 42679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(String filename) { 42721afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = new JournaledFile(new File(filename), new File(filename + ".tmp")); 42730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = new MyHandler(); 42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 42750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables); 4276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 42770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables); 4278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 4279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables); 42800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables); 42815284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 42820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables); 4283627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 42840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables); 4285627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 42860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables); 4287627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 42880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables); 428958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables); 42900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables); 42910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables); 42920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables); 42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = false; 42946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn initTimes(); 42959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = 0; 42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = 0; 42979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 42989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 42999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 43009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 4301633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = 0; 43026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = 0; 4303633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = 0; 4304c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn initDischarge(); 43050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn clearHistoryLocked(); 43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(Parcel p) { 43091afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 43100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mHandler = null; 43110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn clearHistoryLocked(); 43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcel(p); 43139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 43149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn public void setCallback(BatteryCallback cb) { 43160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mCallback = cb; 43170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn } 43180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 4319e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void setNumSpeedSteps(int steps) { 4320e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (sNumSpeedSteps == 0) sNumSpeedSteps = steps; 4321e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 4322e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 4323f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void setRadioScanningTimeout(long timeout) { 4324f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mPhoneSignalScanningTimer != null) { 4325f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.setTimeout(timeout); 4326f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 4327f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 4328f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 43290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 43300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean startIteratingOldHistoryLocked() { 43310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize() 43320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " pos=" + mHistoryBuffer.dataPosition()); 43330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 43341fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mHistoryReadTmp.clear(); 43350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mReadOverflow = false; 43360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = true; 4337ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return (mHistoryIterator = mHistory) != null; 4338ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4339ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 43400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 43410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean getNextOldHistoryLocked(HistoryItem out) { 43420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize(); 43430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!end) { 43441fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mHistoryReadTmp.readDelta(mHistoryBuffer); 43451fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW; 43460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 4347ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn HistoryItem cur = mHistoryIterator; 4348ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (cur == null) { 43490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mReadOverflow && !end) { 43500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "Old history ends before new history!"); 43510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 4352ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return false; 4353ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4354ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn out.setTo(cur); 4355ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mHistoryIterator = cur.next; 43560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (!mReadOverflow) { 43570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (end) { 43580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "New history ends before old history!"); 43591fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } else if (!out.same(mHistoryReadTmp)) { 43600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); 43610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn PrintWriter pw = new PrintWriter(new LogWriter(android.util.Log.WARN, TAG)); 43620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Histories differ!"); 43630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Old history:"); 43640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn (new HistoryPrinter()).printNextItem(pw, out, now); 43650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("New history:"); 43661fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, now); 43670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 43680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 4369ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn return true; 4370ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 4371ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 43729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 43730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void finishIteratingOldHistoryLocked() { 43740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = false; 43750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); 43760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 43770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 43780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 43790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean startIteratingHistoryLocked() { 43800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize() 43810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " pos=" + mHistoryBuffer.dataPosition()); 43820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 43830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mReadOverflow = false; 43840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = true; 43850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return mHistoryBuffer.dataSize() > 0; 43860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 43870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 43880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 43890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public boolean getNextHistoryLocked(HistoryItem out) { 43901fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn final int pos = mHistoryBuffer.dataPosition(); 43911fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn if (pos == 0) { 43921fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn out.clear(); 43931fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn } 43941fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn boolean end = pos >= mHistoryBuffer.dataSize(); 43950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (end) { 43960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return false; 43970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 43980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 43991fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn out.readDelta(mHistoryBuffer); 44000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return true; 44010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 44020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 44030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn @Override 44040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void finishIteratingHistoryLocked() { 44050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mIteratingHistory = false; 44060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); 440732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 44085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 440932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn @Override 4410b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn public long getHistoryBaseTime() { 4411b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn return mHistoryBaseTime; 4412b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn } 44135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4414b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn @Override 44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStartCount() { 44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartCount; 44179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public boolean isScreenOn() { 44249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn return mScreenOn; 44259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 44269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 44276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void initTimes() { 44286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mBatteryRealtime = mTrackBatteryPastUptime = 0; 44296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mBatteryUptime = mTrackBatteryPastRealtime = 0; 44306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 44316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 44326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 44336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 44346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4436c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn void initDischarge() { 4437c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mLowDischargeAmountSinceCharge = 0; 4438c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mHighDischargeAmountSinceCharge = 0; 4439c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOn = 0; 4440c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge = 0; 4441c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOff = 0; 4442c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge = 0; 4443c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4444c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 44456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void resetAllStatsLocked() { 44466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStartCount = 0; 44476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn initTimes(); 44489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mScreenOnTimer.reset(this, false); 44496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 44509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mScreenBrightnessTimer[i].reset(this, false); 44516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mInputEventCounter.reset(false); 44539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneOnTimer.reset(this, false); 44549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mAudioOnTimer.reset(this, false); 44559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mVideoOnTimer.reset(this, false); 44565284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 44579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneSignalStrengthsTimer[i].reset(this, false); 44586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneSignalScanningTimer.reset(this, false); 44606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 44619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mPhoneDataConnectionsTimer[i].reset(this, false); 44626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWifiOnTimer.reset(this, false); 446458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.reset(this, false); 44659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mBluetoothOnTimer.reset(this, false); 44665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 44676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (int i=0; i<mUidStats.size(); i++) { 44686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mUidStats.valueAt(i).reset()) { 44696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUidStats.remove(mUidStats.keyAt(i)); 44706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn i--; 44716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 44746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mKernelWakelockStats.size() > 0) { 44756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn for (SamplingTimer timer : mKernelWakelockStats.values()) { 44766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mUnpluggables.remove(timer); 44776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mKernelWakelockStats.clear(); 44796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn 4481c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn initDischarge(); 44825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 44836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn clearHistoryLocked(); 44846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 44855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 448632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) { 4487c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (oldScreenOn) { 4488c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel; 4489c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (diff > 0) { 4490c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOn += diff; 4491c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge += diff; 4492c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4493c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } else { 4494c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel; 4495c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (diff > 0) { 4496c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOff += diff; 4497c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge += diff; 4498c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4499c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4500c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (newScreenOn) { 4501c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel; 4502c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOffUnplugLevel = 0; 4503c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } else { 4504c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOnUnplugLevel = 0; 4505c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel; 4506c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4507c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4508c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 45096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn void setOnBattery(boolean onBattery, int oldStatus, int level) { 45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 451132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn setOnBatteryLocked(onBattery, oldStatus, level); 451232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 451332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 451432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn 451532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn void setOnBatteryLocked(boolean onBattery, int oldStatus, int level) { 451632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn boolean doWrite = false; 451732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE); 451832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn m.arg1 = onBattery ? 1 : 0; 451932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHandler.sendMessage(m); 452032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mOnBattery = mOnBatteryInternal = onBattery; 452132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn 452232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn long uptime = SystemClock.uptimeMillis() * 1000; 452332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn long mSecRealtime = SystemClock.elapsedRealtime(); 452432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn long realtime = mSecRealtime * 1000; 452532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery) { 452632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // We will reset our status if we are unplugging after the 452732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // battery was last full, or the level is at 100, or 452832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // we have gone through a significant charge (from a very low 452932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // level to a now very high level). 453032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (oldStatus == BatteryManager.BATTERY_STATUS_FULL 453132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || level >= 90 453232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || (mDischargeCurrentLevel < 20 && level >= 80)) { 453332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn doWrite = true; 453432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn resetAllStatsLocked(); 453532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeStartLevel = level; 453632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 453732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateKernelWakelocksLocked(); 453832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 453932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 454032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: " 454132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 454232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn addHistoryRecordLocked(mSecRealtime); 454332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryUptimeStart = uptime; 454432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryRealtimeStart = realtime; 454532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime); 454632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime); 454732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeCurrentLevel = mDischargeUnplugLevel = level; 454832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mScreenOn) { 454932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOnUnplugLevel = level; 455032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOffUnplugLevel = 0; 45516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 455232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOnUnplugLevel = 0; 455332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeScreenOffUnplugLevel = level; 45546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 455532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeAmountScreenOn = 0; 455632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeAmountScreenOff = 0; 4557a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn doUnplugLocked(realtime, mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime); 455832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } else { 455932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateKernelWakelocksLocked(); 456032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 456132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 456232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: " 456332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 456432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn addHistoryRecordLocked(mSecRealtime); 456532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; 456632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; 456732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeCurrentLevel = level; 456832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (level < mDischargeUnplugLevel) { 456932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1; 457032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level; 457132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 457232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn); 4573a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn doPlugLocked(realtime, getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); 457432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 457532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) { 457632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mFile != null) { 457732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn writeAsyncLocked(); 45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 45815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 45826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn // This should probably be exposed in the API, though it's not critical 45836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn private static final int BATTERY_PLUGGED_NONE = 0; 45845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 45856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void setBatteryState(int status, int health, int plugType, int level, 45866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int temp, int volt) { 458732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn synchronized(this) { 458832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn boolean onBattery = plugType == BATTERY_PLUGGED_NONE; 458932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn int oldStatus = mHistoryCur.batteryStatus; 459032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (!mHaveBatteryLevel) { 459132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHaveBatteryLevel = true; 459232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // We start out assuming that the device is plugged in (not 459332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // on battery). If our first report is now that we are indeed 459432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // plugged in, then twiddle our state to correctly reflect that 459532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // since we won't be going through the full setOnBattery(). 459632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery == mOnBattery) { 459732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery) { 459832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 459932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } else { 460032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; 460132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 46026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 460332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn oldStatus = status; 46046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 460532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery) { 460632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mDischargeCurrentLevel = level; 460732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mRecordingHistory = true; 46086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 460932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (onBattery != mOnBattery) { 461032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 46116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryStatus = (byte)status; 46126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryHealth = (byte)health; 46136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryPlugType = (byte)plugType; 46146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryTemperature = (char)temp; 46156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mHistoryCur.batteryVoltage = (char)volt; 461632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn setOnBatteryLocked(onBattery, oldStatus, level); 461732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } else { 461832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn boolean changed = false; 461932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryLevel != level) { 462032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 462132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 462232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 462332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryStatus != status) { 462432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryStatus = (byte)status; 462532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 462632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 462732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryHealth != health) { 462832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryHealth = (byte)health; 462932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 463032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 463132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (mHistoryCur.batteryPlugType != plugType) { 463232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryPlugType = (byte)plugType; 463332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 463432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 463532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (temp >= (mHistoryCur.batteryTemperature+10) 463632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || temp <= (mHistoryCur.batteryTemperature-10)) { 463732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryTemperature = (char)temp; 463832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 463932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 464032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (volt > (mHistoryCur.batteryVoltage+20) 464132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn || volt < (mHistoryCur.batteryVoltage-20)) { 464232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mHistoryCur.batteryVoltage = (char)volt; 464332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn changed = true; 464432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 464532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (changed) { 464632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn addHistoryRecordLocked(SystemClock.elapsedRealtime()); 464732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn } 46486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 464932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) { 465032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // We don't record history while we are plugged in and fully charged. 465132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn // The next time we are unplugged, history will be cleared. 465232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn mRecordingHistory = false; 46536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 46546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 4655633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 46565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateKernelWakelocksLocked() { 4658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = readKernelWakelockStats(); 46595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4660d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen if (m == null) { 4661d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen // Not crashing might make board bringup easier. 46621afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "Couldn't get kernel wake lock stats"); 4663d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen return; 4664d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen } 4665d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen 4666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) { 4667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name = ent.getKey(); 4668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kws = ent.getValue(); 46695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 4671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 46725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 4673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 4674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 4675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedCount(kws.mCount); 4677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); 4678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.setUpdateVersion(sKernelWakelockUpdateVersion); 4679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 46805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != mKernelWakelockStats.size()) { 4682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Set timers to stale if they didn't appear in /proc/wakelocks this time. 4683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 4684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer st = ent.getValue(); 4685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) { 4686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar st.setStale(); 4687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 4690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); 46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery(); 46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeUptime(long curTime, int which) { 47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 47036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart); 47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastUptime; 47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mUptimeStart); 47066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart); 47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 47129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeRealtime(long curTime, int which) { 47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 47146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart); 47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastRealtime; 47169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mRealtimeStart); 47176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart); 47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 47239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryUptime(long curTime, int which) { 47249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 47256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: 47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryUptime + getBatteryUptime(curTime); 47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 47289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastUptime; 47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 47309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(curTime); 47316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: 47329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime; 47339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 47359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryRealtime(long curTime, int which) { 47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 47406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_CHARGED: 47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryRealtime + getBatteryRealtimeLocked(curTime); 47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastRealtime; 47449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 47466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn case STATS_SINCE_UNPLUGGED: 47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime; 47489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked(long curTime) { 47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastUptime; 47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 47559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryUptimeStart; 47569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 47589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked() { 47619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(SystemClock.uptimeMillis() * 1000); 47629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 47659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryUptime(long curTime) { 47669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime); 47679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryRealtimeLocked(long curTime) { 47709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastRealtime; 47719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 47729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryRealtimeStart; 47739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 47759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 47789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryRealtime(long curTime) { 47799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 47809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 47823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long getTcpBytes(long current, long[] dataBytes, int which) { 47833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (which == STATS_LAST) { 47843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 47853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 47866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (which == STATS_SINCE_UNPLUGGED) { 47876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) { 47883718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 47893718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 47906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return current - dataBytes[STATS_SINCE_UNPLUGGED]; 47913718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 47926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else if (which == STATS_SINCE_CHARGED) { 47936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED]; 47943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 47953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return current - dataBytes[STATS_CURRENT]; 47963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 47973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 47983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 47993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 48003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesSent(int which) { 48011059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final long mobileTxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).txBytes; 48021059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return getTcpBytes(mobileTxBytes, mMobileDataTx, which); 48033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 48043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 48053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 48063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesReceived(int which) { 48071059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final long mobileRxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).rxBytes; 48081059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return getTcpBytes(mobileRxBytes, mMobileDataRx, which); 48093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 48103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 48113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 48123718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesSent(int which) { 48131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final long totalTxBytes = getNetworkStatsSummary().getTotal(null).txBytes; 48141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return getTcpBytes(totalTxBytes, mTotalDataTx, which); 48153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 48163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 48173718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 48183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesReceived(int which) { 48191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final long totalRxBytes = getNetworkStatsSummary().getTotal(null).rxBytes; 48201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return getTcpBytes(totalRxBytes, mTotalDataRx, which); 48213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 48223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 4823105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 4824633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevel() { 4825105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 4826633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeStartLevelLocked(); 4827105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4828105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 48295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4830633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevelLocked() { 48316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return mDischargeUnplugLevel; 4832105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 48335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4834105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 4835633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevel() { 4836105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 4837633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeCurrentLevelLocked(); 4838105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 48405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 4841633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevelLocked() { 4842e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return mDischargeCurrentLevel; 4843105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 48449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4845e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 48463bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public int getLowDischargeAmountSinceCharge() { 48473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn synchronized(this) { 4848e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int val = mLowDischargeAmountSinceCharge; 4849e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) { 4850e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn val += mDischargeUnplugLevel-mDischargeCurrentLevel-1; 4851e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 4852e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return val; 48533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 48543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 48553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 48563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn @Override 48573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public int getHighDischargeAmountSinceCharge() { 48583bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn synchronized(this) { 4859e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int val = mHighDischargeAmountSinceCharge; 4860e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) { 4861e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn val += mDischargeUnplugLevel-mDischargeCurrentLevel; 4862e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 4863e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return val; 48643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 48653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 4866c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4867c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOn() { 4868c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4869c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOn; 4870c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && mScreenOn 4871c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) { 4872c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel; 4873c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4874c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4875c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4876c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4877c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4878c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOnSinceCharge() { 4879c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4880c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOnSinceCharge; 4881c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && mScreenOn 4882c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) { 4883c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel; 4884c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4885c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4886c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4887c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4888c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4889c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOff() { 4890c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4891c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOff; 4892c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && !mScreenOn 4893c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) { 4894c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel; 4895c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4896c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4897c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4898c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4899c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn 4900c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn public int getDischargeAmountScreenOffSinceCharge() { 4901c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn synchronized(this) { 4902c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn int val = mDischargeAmountScreenOffSinceCharge; 4903c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn if (mOnBattery && !mScreenOn 4904c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) { 4905c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel; 4906c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4907c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn return val; 4908c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 4909c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn } 49103bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 49113bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn @Override 4912e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public int getCpuSpeedSteps() { 4913e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return sNumSpeedSteps; 4914e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 4915e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 49169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 49179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular uid, creating if needed. 49189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 49199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid getUidStatsLocked(int uid) { 49209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.get(uid); 49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u == null) { 49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u = new Uid(uid); 49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u; 49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 49299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the statistics object for a particular uid. 49309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 49319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeUidStatsLocked(int uid) { 49329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.remove(uid); 49339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 493432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 49359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 49369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 49389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 49399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Proc getProcessStatsLocked(int uid, String name) { 49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getProcessStatsLocked(name); 49429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 494532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * Retrieve the statistics object for a particular process, given 494632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * the name of the process. 494732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @param name process name 494832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @return the statistics object for the process 494932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani */ 4950819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani public Uid.Proc getProcessStatsLocked(String name, int pid) { 495132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani int uid; 495232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani if (mUidCache.containsKey(name)) { 495332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani uid = mUidCache.get(name); 495432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } else { 4955819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani uid = Process.getUidForPid(pid); 495632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mUidCache.put(name, uid); 495732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 495832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani Uid u = getUidStatsLocked(uid); 495932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return u.getProcessStatsLocked(name); 496032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 496132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 496232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani /** 49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 49649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 49659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 49669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg getPackageStatsLocked(int uid, String pkg) { 49679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 49689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getPackageStatsLocked(pkg); 49699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 49729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 49739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 49749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 49759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) { 49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 49779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getServiceStatsLocked(pkg, name); 49789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 49799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 498058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn /** 498158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn * Massage data to distribute any reasonable work down to more specific 498258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn * owners. Must only be called on a dead BatteryStats object! 498358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn */ 498458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void distributeWorkLocked(int which) { 498558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn // Aggregate all CPU time associated with WIFI. 498658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid wifiUid = mUidStats.get(Process.WIFI_UID); 498758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (wifiUid != null) { 498858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which); 498958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (Uid.Proc proc : wifiUid.mProcessStats.values()) { 499058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which); 499158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<mUidStats.size(); i++) { 499258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid uid = mUidStats.valueAt(i); 499358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uid.mUid != Process.WIFI_UID) { 499458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long uidRunningTime = uid.getWifiRunningTime(uSecTime, which); 499558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uidRunningTime > 0) { 499658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*"); 499758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn long time = proc.getUserTime(which); 499858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 499958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mUserTime += time; 500058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mUserTime -= time; 500158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = proc.getSystemTime(which); 500258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 500358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mSystemTime += time; 500458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mSystemTime -= time; 500558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = proc.getForegroundTime(which); 500658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 500758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mForegroundTime += time; 500858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn proc.mForegroundTime -= time; 500958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int sb=0; sb<proc.mSpeedBins.length; sb++) { 501058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn SamplingCounter sc = proc.mSpeedBins[sb]; 501158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (sc != null) { 501258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = sc.getCountLocked(which); 501358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn time = (time*uidRunningTime)/totalRunningTime; 501458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn SamplingCounter uidSc = uidProc.mSpeedBins[sb]; 501558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (uidSc == null) { 501658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidSc = new SamplingCounter(mUnpluggables); 501758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidProc.mSpeedBins[sb] = uidSc; 501858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 501958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn uidSc.mCount.addAndGet((int)time); 502058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn sc.mCount.addAndGet((int)-time); 502158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 502258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 502358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn totalRunningTime -= uidRunningTime; 502458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 502558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 502658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 502758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 502858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 502958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 503058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 50316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void shutdownLocked() { 5032ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeSyncLocked(); 50336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mShuttingDown = true; 50341afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 50355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5036ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Parcel mPendingWrite = null; 5037ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn final ReentrantLock mWriteLock = new ReentrantLock(); 5038ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 5039ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void writeAsyncLocked() { 5040ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeLocked(false); 5041ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 5042ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 5043ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void writeSyncLocked() { 5044ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeLocked(true); 5045ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 5046ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 5047ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn void writeLocked(boolean sync) { 50481afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 50491afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "writeLocked: no file associated with this instance"); 50509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (mShuttingDown) { 50546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn return; 50556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 50565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5057ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Parcel out = Parcel.obtain(); 5058ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn writeSummaryToParcel(out); 5059ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mLastWriteTime = SystemClock.elapsedRealtime(); 5060ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 5061ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (mPendingWrite != null) { 5062ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite.recycle(); 5063ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 5064ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite = out; 5065ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 5066ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn if (sync) { 5067ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn commitPendingDataToDisk(); 5068ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } else { 5069ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Thread thr = new Thread("BatteryStats-Write") { 5070ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn @Override 5071ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void run() { 5072ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 5073ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn commitPendingDataToDisk(); 5074ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 5075ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn }; 5076ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn thr.start(); 5077ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 5078ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 5079ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 5080ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn public void commitPendingDataToDisk() { 5081f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn final Parcel next; 5082ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn synchronized (this) { 5083ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn next = mPendingWrite; 5084ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mPendingWrite = null; 5085f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn if (next == null) { 5086f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn return; 5087f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn } 5088ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 5089ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mWriteLock.lock(); 5090ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } 5091ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn 50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 50931afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite()); 5094ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn stream.write(next.marshall()); 50959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.flush(); 50968bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn FileUtils.sync(stream); 50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 50981afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile.commit(); 50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 51001afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "Error writing battery statistics", e); 5101ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mFile.rollback(); 5102ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn } finally { 5103ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn next.recycle(); 5104ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn mWriteLock.unlock(); 51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static byte[] readFully(FileInputStream stream) throws java.io.IOException { 51099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int avail = stream.available(); 51119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[avail]; 51129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 51139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int amt = stream.read(data, pos, data.length-pos); 51149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "Read " + amt + " bytes at " + pos 51159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " of avail " + data.length); 51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt <= 0) { 51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "**** FINISHED READING: pos=" + pos 51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " len=" + data.length); 51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos += amt; 51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project avail = stream.available(); 51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (avail > data.length-pos) { 51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] newData = new byte[pos+avail]; 51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(data, 0, newData, 0, pos); 51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = newData; 51279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readLocked() { 51321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 51331afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readLocked: no file associated with this instance"); 51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 51359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 51401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn File file = mFile.chooseForRead(); 51411afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (!file.exists()) { 51421afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51441afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileInputStream stream = new FileInputStream(file); 51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] raw = readFully(stream); 51479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in = Parcel.obtain(); 51489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.unmarshall(raw, 0, raw.length); 51499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.setDataPosition(0); 51509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSummaryFromParcel(in); 51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(java.io.IOException e) { 51541afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.e("BatteryStats", "Error reading battery statistics", e); 51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 51570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long now = SystemClock.elapsedRealtime(); 5158e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn if (USE_OLD_HISTORY) { 5159e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn addHistoryRecordLocked(now, HistoryItem.CMD_START); 5160e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn } 51610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryBufferLocked(now, HistoryItem.CMD_START); 51629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 51659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 51669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5168ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn void readHistory(Parcel in, boolean andOldHistory) { 5169ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn final long historyBaseTime = in.readLong(); 51700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 51710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataSize(0); 51720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.setDataPosition(0); 51730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 51740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int bufSize = in.readInt(); 51750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn int curPos = in.dataPosition(); 51760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) { 51770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "File corrupt: history data buffer too large " + bufSize); 51780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ((bufSize&~3) != bufSize) { 51790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn Slog.w(TAG, "File corrupt: history data buffer not aligned " + bufSize); 51800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else { 51810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "***************** READING NEW HISTORY: " + bufSize 51820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + " bytes at " + curPos); 51830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistoryBuffer.appendFrom(in, curPos, bufSize); 51840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn in.setDataPosition(curPos + bufSize); 518532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 51865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5187ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (andOldHistory) { 5188ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn readOldHistory(in); 5189ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 5190ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 5191ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (DEBUG_HISTORY) { 5192ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn StringBuilder sb = new StringBuilder(128); 5193ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append("****************** OLD mHistoryBaseTime: "); 5194ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mHistoryBaseTime, sb); 5195ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn Slog.i(TAG, sb.toString()); 5196ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 5197ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn mHistoryBaseTime = historyBaseTime; 5198ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (DEBUG_HISTORY) { 5199ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn StringBuilder sb = new StringBuilder(128); 5200ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append("****************** NEW mHistoryBaseTime: "); 5201ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mHistoryBaseTime, sb); 5202ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn Slog.i(TAG, sb.toString()); 5203ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 5204ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 5205ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn // We are just arbitrarily going to insert 1 minute from the sample of 5206ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn // the last run until samples in this run. 5207ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (mHistoryBaseTime > 0) { 5208ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn long oldnow = SystemClock.elapsedRealtime(); 5209ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn mHistoryBaseTime = (mHistoryBaseTime - oldnow) + 60*1000; 5210ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (DEBUG_HISTORY) { 5211ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn StringBuilder sb = new StringBuilder(128); 5212ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append("****************** ADJUSTED mHistoryBaseTime: "); 5213ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mHistoryBaseTime, sb); 5214ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn Slog.i(TAG, sb.toString()); 5215ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 52161e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn } 521732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 52185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 52190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void readOldHistory(Parcel in) { 5220e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn if (!USE_OLD_HISTORY) { 5221e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn return; 5222e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn } 52230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mHistory = mHistoryEnd = mHistoryCache = null; 52240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn long time; 52255e3357fcee2a23a08434873a89e8ada4c6e6d893Conley Owens while (in.dataAvail() > 0 && (time=in.readLong()) >= 0) { 52260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn HistoryItem rec = new HistoryItem(time, in); 52270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn addHistoryRecordLocked(rec); 52280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 52290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 52300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 5231ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn void writeHistory(Parcel out, boolean andOldHistory) { 5232ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (DEBUG_HISTORY) { 5233ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn StringBuilder sb = new StringBuilder(128); 5234ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append("****************** WRITING mHistoryBaseTime: "); 5235ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mHistoryBaseTime, sb); 5236ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn sb.append(" mLastHistoryTime: "); 5237ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn TimeUtils.formatDuration(mLastHistoryTime, sb); 5238ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn Slog.i(TAG, sb.toString()); 5239ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 5240ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn out.writeLong(mHistoryBaseTime + mLastHistoryTime); 52410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn out.writeInt(mHistoryBuffer.dataSize()); 52420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: " 52430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition()); 52440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize()); 5245ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 5246ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn if (andOldHistory) { 5247ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn writeOldHistory(out); 5248ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 52490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 52500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 52510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn void writeOldHistory(Parcel out) { 5252e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn if (!USE_OLD_HISTORY) { 5253e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn return; 5254e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn } 52556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn HistoryItem rec = mHistory; 525632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn while (rec != null) { 525732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec.time >= 0) rec.writeToParcel(out, 0); 525832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec = rec.next; 525932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 526032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn out.writeLong(-1); 526132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 52625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSummaryFromParcel(Parcel in) { 52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int version = in.readInt(); 52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (version != VERSION) { 52661afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readFromParcel: version got " + version 52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", expected " + VERSION + "; erasing old stats"); 52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5271ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn readHistory(in, true); 52725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 52786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = in.readInt(); 5279633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 52803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = in.readInt(); 52813bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = in.readInt(); 5282c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge = in.readInt(); 5283c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge = in.readInt(); 52845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 52865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.readSummaryFromParcelLocked(in); 5289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 5290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); 5291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5292617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.readSummaryFromParcelLocked(in); 52939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 52949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.readSummaryFromParcelLocked(in); 52955284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 5296627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in); 5297627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5298f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in); 5299627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 5300627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in); 5301627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5302105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 5303105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.readSummaryFromParcelLocked(in); 530458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 530558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in); 5306105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 5307105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.readSummaryFromParcelLocked(in); 53089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 53101afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NKW > 10000) { 53111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW); 53121afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 53131afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 5314c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 5315c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 5316c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String kwltName = in.readString(); 5317c64edde69d18498fb2954f71a546357b07ab996aEvan Millar getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in); 5318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5319c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5320e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 5321e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 5322e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 53239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = in.readInt(); 53241afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NU > 10000) { 53251afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many uids " + NU); 53261afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 53271afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 53289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 53299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 53309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 533358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunning = false; 53346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 533558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunningTimer.readSummaryFromParcelLocked(in); 53366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5337105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockOut = false; 53386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 53396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); 53406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 53416ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly u.mWifiScanStarted = false; 53426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 53436ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly u.mWifiScanTimer.readSummaryFromParcelLocked(in); 53446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 53455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastEnabled = false; 53466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 53476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mWifiMulticastTimer.readSummaryFromParcelLocked(in); 53486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 53496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOn = false; 53506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 5351a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn u.createAudioTurnedOnTimerLocked().readSummaryFromParcelLocked(in); 53526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 53536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOn = false; 53546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (in.readInt() != 0) { 5355a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn u.createVideoTurnedOnTimerLocked().readSummaryFromParcelLocked(in); 5356a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 5357a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (in.readInt() != 0) { 5358a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn u.createVibratorOnTimerLocked().readSummaryFromParcelLocked(in); 53596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 53605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 5361617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() != 0) { 5362617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 5363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.initUserActivityLocked(); 5364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5365617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 5366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); 5367617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 53695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 53709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = in.readInt(); 53717b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NW > 100) { 53721afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many wake locks " + NW); 53731afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 53741afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 53759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iw = 0; iw < NW; iw++) { 53769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wlName = in.readString(); 53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in); 53799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in); 53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 53849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in); 53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = in.readInt(); 53897b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NP > 1000) { 53901afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many sensors " + NP); 53911afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 53921afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 53939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NP; is++) { 53949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int seNumber = in.readInt(); 53959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 53969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getSensorTimerLocked(seNumber, true) 53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .readSummaryFromParcelLocked(in); 53989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 54027b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NP > 1000) { 54031afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many processes " + NP); 54041afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 54051afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 54079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String procName = in.readString(); 54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc p = u.getProcessStatsLocked(procName); 54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mUserTime = p.mLoadedUserTime = in.readLong(); 54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mSystemTime = p.mLoadedSystemTime = in.readLong(); 54119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStarts = p.mLoadedStarts = in.readInt(); 541258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn int NSB = in.readInt(); 54137b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NSB > 100) { 54147b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn Slog.w(TAG, "File corrupt: too many speed bins " + NSB); 54157b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return; 54167b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 541758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins = new SamplingCounter[NSB]; 541858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<NSB; i++) { 541958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (in.readInt() != 0) { 542058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins[i] = new SamplingCounter(mUnpluggables); 542158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn p.mSpeedBins[i].readSummaryFromParcelLocked(in); 542258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 542358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 54247b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (!p.readExcessivePowerFromParcelLocked(in)) { 54257b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return; 54267b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 54301afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NP > 10000) { 54311afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many packages " + NP); 54321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 54331afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 54349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 54359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = in.readString(); 54369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg p = u.getPackageStatsLocked(pkgName); 54379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mWakeups = p.mLoadedWakeups = in.readInt(); 54389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = in.readInt(); 54397b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn if (NS > 1000) { 54407b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn Slog.w(TAG, "File corrupt: too many services " + NS); 54417b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn return; 54427b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn } 54439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NS; is++) { 54449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String servName = in.readString(); 54459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); 54469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStartTime = s.mLoadedStartTime = in.readLong(); 54479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStarts = s.mLoadedStarts = in.readInt(); 54489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLaunches = s.mLoadedLaunches = in.readInt(); 54499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesReceived = in.readLong(); 54539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesSent = in.readLong(); 54549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 54589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a summary of the statistics to a Parcel, in a format suitable to be written to 54599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disk. This format does not allow a lossless round-trip. 54609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 54619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 54639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeSummaryToParcel(Parcel out) { 54640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Need to update with current kernel wake lock counts. 54650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn updateKernelWakelocksLocked(); 54660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 54679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW_SYS = SystemClock.uptimeMillis() * 1000; 54689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000; 54699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW = getBatteryUptimeLocked(NOW_SYS); 54709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS); 54719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(VERSION); 54739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5474ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn writeHistory(out, true); 54755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 54769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 54776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED)); 54786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); 54796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED)); 54806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); 54816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(mDischargeUnplugLevel); 5482633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 5483e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn out.writeInt(getLowDischargeAmountSinceCharge()); 5484e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn out.writeInt(getHighDischargeAmountSinceCharge()); 5485c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(getDischargeAmountScreenOnSinceCharge()); 5486c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(getDischargeAmountScreenOffSinceCharge()); 54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5489617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 5490617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 5491617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5492617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeSummaryFromParcelLocked(out); 54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 54945284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 5495627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 5496627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5497f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5498627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 5499627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 5500627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5501105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 550258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5503105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 55049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5505c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 5506c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 5507c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer kwlt = ent.getValue(); 5508c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 5509c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 5510c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 5511c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL); 5512c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 5513c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 5514c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5515c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 55165a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5517e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 55189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = mUidStats.size(); 55199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NU); 55209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 55219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(iu)); 55229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 55235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 552458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (u.mWifiRunningTimer != null) { 55256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 552658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 55276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 55286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 55296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 55306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mFullWifiLockTimer != null) { 55316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 55326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 55336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 55346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 55356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 55366ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (u.mWifiScanTimer != null) { 55376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 55386ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly u.mWifiScanTimer.writeSummaryFromParcelLocked(out, NOWREAL); 55396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 55406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 55416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 55426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mWifiMulticastTimer != null) { 55436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 55446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL); 55456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 55466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 55476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 55486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mAudioTurnedOnTimer != null) { 55496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 55506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 55516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 55526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 55536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 55546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn if (u.mVideoTurnedOnTimer != null) { 55556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(1); 55566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 55576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } else { 55586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(0); 55596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn } 5560a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (u.mVibratorOnTimer != null) { 5561a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn out.writeInt(1); 5562a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn u.mVibratorOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 5563a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } else { 5564a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn out.writeInt(0); 5565a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 55669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5567617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 5568617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 5569617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 5570617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 5571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 5572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); 5573617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5574617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 55755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 55769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = u.mWakelockStats.size(); 55779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NW); 55789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 55799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent 55809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mWakelockStats.entrySet()) { 55819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 55829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 55839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerFull != null) { 55849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 55859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL); 55869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 55879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 55889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerPartial != null) { 55909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 55919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL); 55929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 55939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerWindow != null) { 55969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 55979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL); 55989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 55999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 56009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NSE = u.mSensorStats.size(); 56059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NSE); 56069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NSE > 0) { 56079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent 56089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mSensorStats.entrySet()) { 56099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ent.getKey()); 56109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 56119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se.mTimer != null) { 56129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 56139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL); 56149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 56159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 56169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = u.mProcessStats.size(); 56219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 56229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 56239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent 56249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mProcessStats.entrySet()) { 56259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 56269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 56279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime); 56289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime); 56299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts); 563058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn final int N = ps.mSpeedBins.length; 563158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(N); 563258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn for (int i=0; i<N; i++) { 563358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn if (ps.mSpeedBins[i] != null) { 563458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(1); 563558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn ps.mSpeedBins[i].writeSummaryFromParcelLocked(out); 563658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else { 563758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn out.writeInt(0); 563858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 563958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 5640287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn ps.writeExcessivePowerToParcelLocked(out); 56419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = u.mPackageStats.size(); 56459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 56469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 56479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent 56489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mPackageStats.entrySet()) { 56499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 56509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 56519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups); 56529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = ps.mServiceStats.size(); 56539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NS); 56549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NS > 0) { 56559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent 56569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : ps.mServiceStats.entrySet()) { 56579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(sent.getKey()); 56589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue(); 56599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = ss.getStartTimeToNowLocked(NOW); 56609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time); 56619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts); 56629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches); 56639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 56686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED)); 56696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED)); 56709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readFromParcel(Parcel in) { 56749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcelLocked(in); 56759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 56779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 56789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = in.readInt(); 56799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != MAGIC) { 56809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ParcelFormatException("Bad magic number"); 56819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5683ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn readHistory(in, false); 56845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 56859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 56869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 56873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mBatteryLastUptime = 0; 56889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 56893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mBatteryLastRealtime = 0; 56909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 56910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in); 5692617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 56930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, 56940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5695617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5696617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables, in); 56979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 56980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 56995284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 57000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, 57010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5702627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 57030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in); 5704627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 57050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, 57060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn null, mUnpluggables, in); 5707627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5708105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 57090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 571058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunning = false; 571158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 5712105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 57130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in); 57149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 57159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = in.readLong(); 57163bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastUptime = 0; 57179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 57189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = in.readLong(); 57193bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLastRealtime = 0; 57209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = in.readInt() != 0; 57219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBatteryInternal = false; // we are no longer really running. 57229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = in.readLong(); 57239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = in.readLong(); 57249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = in.readLong(); 57259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = in.readLong(); 57269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = in.readLong(); 57279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = in.readLong(); 57286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mDischargeUnplugLevel = in.readInt(); 5729633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 57303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mLowDischargeAmountSinceCharge = in.readInt(); 57313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn mHighDischargeAmountSinceCharge = in.readInt(); 5732c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOn = in.readInt(); 5733c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOnSinceCharge = in.readInt(); 5734c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOff = in.readInt(); 5735c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn mDischargeAmountScreenOffSinceCharge = in.readInt(); 57369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = in.readLong(); 57379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataRx[STATS_LAST] = in.readLong(); 57396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1; 57403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataTx[STATS_LAST] = in.readLong(); 57416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1; 57423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataRx[STATS_LAST] = in.readLong(); 57436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1; 57443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataTx[STATS_LAST] = in.readLong(); 57456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1; 57463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 57473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = in.readLong(); 57483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 57493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 57503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = in.readInt(); 57513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 57523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 5753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.clear(); 5754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 5755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 5756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 5757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String wakelockName = in.readString(); 5758244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel 5759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); 5760c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(wakelockName, kwlt); 5761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 57635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 57649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers.clear(); 57659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers.clear(); 57669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers.clear(); 576758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiRunningTimers.clear(); 576858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFullWifiLockTimers.clear(); 57696ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mWifiScanTimers.clear(); 577058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mWifiMulticastTimers.clear(); 57719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5772e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 5773e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 57749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numUids = in.readInt(); 57759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 57769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numUids; i++) { 57779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 57789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 57799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.readFromParcelLocked(mUnpluggables, in); 57809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.append(uid, u); 57819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 57849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 57853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn writeToParcelLocked(out, true, flags); 57863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 57873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn 57883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn public void writeToParcelWithoutUids(Parcel out, int flags) { 57893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn writeToParcelLocked(out, false, flags); 57909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 57925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh @SuppressWarnings("unused") 57933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn void writeToParcelLocked(Parcel out, boolean inclUids, int flags) { 57940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Need to update with current kernel wake lock counts. 57950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn updateKernelWakelocksLocked(); 57960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 57979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecUptime = SystemClock.uptimeMillis() * 1000; 57989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 57999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptimeLocked(uSecUptime); 58009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 58015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 58029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(MAGIC); 58035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 5804ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn writeHistory(out, false); 58055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 58069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 58079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryUptime); 58089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryRealtime); 58099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeToParcel(out, batteryRealtime); 5810617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 5811617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime); 5812617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 5813617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeToParcel(out); 58149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeToParcel(out, batteryRealtime); 58155284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 5816627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime); 5817627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5818f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime); 5819627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 5820627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime); 5821627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5822105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeToParcel(out, batteryRealtime); 582358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime); 5824105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeToParcel(out, batteryRealtime); 58259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptime); 58269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptimeStart); 58279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtime); 58289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtimeStart); 58299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mOnBattery ? 1 : 0); 58309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryUptime); 58319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryUptimeStart); 58329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryRealtime); 58339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryRealtimeStart); 58349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryUptime); 58359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryRealtime); 58366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeInt(mDischargeUnplugLevel); 5837633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 58383bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mLowDischargeAmountSinceCharge); 58393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mHighDischargeAmountSinceCharge); 5840c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOn); 5841c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOnSinceCharge); 5842c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOff); 5843c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn out.writeInt(mDischargeAmountScreenOffSinceCharge); 58449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastWriteTime); 58459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED)); 58476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED)); 58486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED)); 58496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED)); 58503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 58513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Write radio uptime for data 58523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeLong(getRadioDataUptime()); 58533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 58543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeInt(getBluetoothPingCount()); 58553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 58563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (inclUids) { 58573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mKernelWakelockStats.size()); 58583bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 58593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn SamplingTimer kwlt = ent.getValue(); 58603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (kwlt != null) { 58613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(1); 58623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeString(ent.getKey()); 58633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn Timer.writeTimerToParcel(out, kwlt, batteryRealtime); 58643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 58653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 58663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 5867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 58683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 58693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 5870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 5871e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 5872e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 5873e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 58743bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn if (inclUids) { 58753bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn int size = mUidStats.size(); 58763bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(size); 58773bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn for (int i = 0; i < size; i++) { 58783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(mUidStats.keyAt(i)); 58793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn Uid uid = mUidStats.valueAt(i); 58809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58813bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn uid.writeToParcelLocked(out, batteryRealtime); 58823bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } 58833bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn } else { 58843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn out.writeInt(0); 58859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<BatteryStatsImpl> CREATOR = 58899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<BatteryStatsImpl>() { 58909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl createFromParcel(Parcel in) { 58919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl(in); 58929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl[] newArray(int size) { 58959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl[size]; 58969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 58985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh 58990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn public void prepareForDumpLocked() { 59000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // Need to retrieve current kernel wake lock stats before printing. 59010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn updateKernelWakelocksLocked(); 59020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 59030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 59041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void dumpLocked(PrintWriter pw) { 59059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) { 59061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 59071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen timer:"); 59081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenOnTimer.logState(pr, " "); 5909617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 59101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen brightness #" + i + ":"); 59111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenBrightnessTimer[i].logState(pr, " "); 5912617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 59131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Input event counter:"); 59141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mInputEventCounter.logState(pr, " "); 59151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Phone timer:"); 59161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneOnTimer.logState(pr, " "); 59175284090631e638b916d9a453212e9dc802656a67Wink Saville for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { 59181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Signal strength #" + i + ":"); 59191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneSignalStrengthsTimer[i].logState(pr, " "); 5920627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 5921f37447bad3773b62176baa837908daf6edb44273Amith Yamasani pr.println("*** Signal scanning :"); 5922f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.logState(pr, " "); 5923627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 59241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Data connection type #" + i + ":"); 59251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneDataConnectionsTimer[i].logState(pr, " "); 59261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 59271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Wifi timer:"); 59281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiOnTimer.logState(pr, " "); 59291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** WifiRunning timer:"); 593058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mGlobalWifiRunningTimer.logState(pr, " "); 59311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Bluetooth timer:"); 59321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mBluetoothOnTimer.logState(pr, " "); 59331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey pr.println("*** Mobile ifaces:"); 59341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey pr.println(mMobileIfaces.toString()); 59359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dumpLocked(pw); 59379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 59391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private NetworkStats mNetworkSummaryCache; 59401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private NetworkStats mNetworkDetailCache; 59411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 59421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private NetworkStats getNetworkStatsSummary() { 59431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // NOTE: calls from BatteryStatsService already hold this lock 59441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (this) { 59451059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (mNetworkSummaryCache == null 59461059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey || mNetworkSummaryCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) { 5947418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey mNetworkSummaryCache = null; 5948418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey 5949418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) { 5950418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey try { 5951e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mNetworkSummaryCache = mNetworkStatsFactory.readNetworkStatsSummaryDev(); 59529a2c2a6da90abbcc9a064c20e93ed885651f4ae1Jeff Sharkey } catch (IOException e) { 5953418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey Log.wtf(TAG, "problem reading network stats", e); 5954418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey } 5955418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey } 5956418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey 5957418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey if (mNetworkSummaryCache == null) { 59581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey mNetworkSummaryCache = new NetworkStats(SystemClock.elapsedRealtime(), 0); 59591059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 59601059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 59611059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return mNetworkSummaryCache; 59621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 59631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 59641059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 59651059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private NetworkStats getNetworkStatsDetailGroupedByUid() { 59661059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // NOTE: calls from BatteryStatsService already hold this lock 59671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (this) { 59681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (mNetworkDetailCache == null 59691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey || mNetworkDetailCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) { 5970418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey mNetworkDetailCache = null; 5971418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey 5972418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) { 5973418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey try { 5974418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey mNetworkDetailCache = mNetworkStatsFactory 5975418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey .readNetworkStatsDetail().groupedByUid(); 59769a2c2a6da90abbcc9a064c20e93ed885651f4ae1Jeff Sharkey } catch (IOException e) { 5977418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey Log.wtf(TAG, "problem reading network stats", e); 5978418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey } 5979418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey } 5980418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey 5981418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey if (mNetworkDetailCache == null) { 59821059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey mNetworkDetailCache = new NetworkStats(SystemClock.elapsedRealtime(), 0); 59831059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 59841059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 59851059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return mNetworkDetailCache; 59861059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 59871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 59889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5989