BatteryStatsImpl.java revision 32907cfb38bda2d3c052cf5139c5b592678fedbb
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 191afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport com.android.internal.util.JournaledFile; 201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn 213f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset; 221719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriffimport android.net.TrafficStats; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 27c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 29f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState; 30e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 31627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 351afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport android.util.Slog; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 47c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 494cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. All times are represented in microseconds except where indicated 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "BatteryStatsImpl"; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG = false; 5932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn private static final boolean DEBUG_HISTORY = false; 6032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAGIC = 0xBA757475; // 'BATSTATS' 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Current on-disk Parcel version 6532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn private static final int VERSION = 44; 66e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 679e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // The maximum number of names wakelocks we will keep track of 689e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // per uid; once the limit is reached, we batch the remaining wakelocks 699e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // in to one common name. 709e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn private static final int MAX_WAKELOCKS_PER_UID = 20; 719e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn 729e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn private static final String BATCHED_WAKELOCK_NAME = "*overflow*"; 739e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn 74e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani private static int sNumSpeedSteps; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 761afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn private final JournaledFile mFile; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected organized by uids. 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SparseArray<BatteryStatsImpl.Uid> mUidStats = 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SparseArray<BatteryStatsImpl.Uid>(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A set of pools of currently active timers. When a timer is queried, we will divide the 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // elapsed time by the number of active timers to arrive at that timer's share of the time. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In order to do this, we must refresh each timer whenever the number of active timers 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes. 88c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>(); 89c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>(); 90c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>(); 91c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers 92c64edde69d18498fb2954f71a546357b07ab996aEvan Millar = new SparseArray<ArrayList<StopwatchTimer>>(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are the objects that will want to do something when the device 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is unplugged from power. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn BatteryHistoryRecord mHistory; 9932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn BatteryHistoryRecord mHistoryEnd; 10032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn BatteryHistoryRecord mHistoryCache; 10132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn final BatteryHistoryRecord mHistoryCur = new BatteryHistoryRecord(); 10232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStartCount; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryUptime; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastUptime; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryRealtime; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastRealtime; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptime; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptimeStart; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUptime; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtime; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtimeStart; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastRealtime; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mScreenOn; 118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScreenOnTimer; 1193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 120617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mScreenBrightnessBin = -1; 121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; 122617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 123617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter mInputEventCounter; 124617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mPhoneOn; 126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mPhoneOnTimer; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 128244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioOn; 129244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioOnTimer; 130244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 131244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoOn; 132244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoOnTimer; 133244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 134627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneSignalStrengthBin = -1; 135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneSignalStrengthsTimer = 136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS]; 137f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 138f37447bad3773b62176baa837908daf6edb44273Amith Yamasani StopwatchTimer mPhoneSignalScanningTimer; 139f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 140627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneDataConnectionType = -1; 141c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneDataConnectionsTimer = 142c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_DATA_CONNECTION_TYPES]; 143627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mWifiOn; 145c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiOnTimer; 146617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mWifiOnUid = -1; 147d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 148d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood boolean mWifiRunning; 149c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiRunningTimer; 150105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 151105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mBluetoothOn; 152c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mBluetoothOnTimer; 1533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 1543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** Bluetooth headset object */ 1553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani BluetoothHeadset mBtHeadset; 1563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These provide time bases that discount the time the device is plugged 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in to power. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBattery; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBatteryInternal; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastUptime; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryUptimeStart; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastRealtime; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryRealtimeStart; 1673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryUptime; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryRealtime; 1703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 171105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /* 172105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * These keep track of battery levels (1-100) at the last plug event and the last unplug event. 173105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 174633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeStartLevel; 175633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeCurrentLevel; 176244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastWriteTime = 0; // Milliseconds 178244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Mobile data transferred while on battery 1803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataTx = new long[4]; 1813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mMobileDataRx = new long[4]; 1823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataTx = new long[4]; 1833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long[] mTotalDataRx = new long[4]; 1843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 1853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataUptime; 1863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long mRadioDataStart; 1873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 1883f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingCount; 1893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int mBluetoothPingStart = -1; 1903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 191f37447bad3773b62176baa837908daf6edb44273Amith Yamasani private int mPhoneServiceState = -1; 192f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 193c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Holds a SamplingTimer associated with each kernel wakelock name being tracked. 195c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 196c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final HashMap<String, SamplingTimer> mKernelWakelockStats = 197c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, SamplingTimer>(); 198c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public Map<String, ? extends SamplingTimer> getKernelWakelockStats() { 200c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mKernelWakelockStats; 201c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 202c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static int sKernelWakelockUpdateVersion = 0; 204c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 205c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static final int[] PROC_WAKELOCKS_FORMAT = new int[] { 206c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_STRING, // 0: name 207c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 1: count 208c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 209c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 211c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 5: totalTime 212c64edde69d18498fb2954f71a546357b07ab996aEvan Millar }; 213c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 214c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final String[] mProcWakelocksName = new String[3]; 215c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final long[] mProcWakelocksData = new long[3]; 216c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 217c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 218c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added 219c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * to mKernelWakelockStats. 220c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 221c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> mProcWakelockFileStats = 222c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, KernelWakelockStats>(); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>(); 22532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For debugging 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl() { 2281afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface Unpluggable { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unplug(long batteryUptime, long batteryRealtime); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void plug(long batteryUptime, long batteryRealtime); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 237617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * State for keeping track of counting information. 238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 239e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class Counter extends BatteryStats.Counter implements Unpluggable { 2404cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate final AtomicInteger mCount = new AtomicInteger(); 241617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLoadedCount; 242617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLastCount; 243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mUnpluggedCount; 244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mPluggedCount; 245617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 246617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables, Parcel in) { 2474cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = in.readInt(); 2484cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 249617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLoadedCount = in.readInt(); 250617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLastCount = in.readInt(); 251617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = in.readInt(); 252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 253617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 254617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables) { 256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void writeToParcel(Parcel out) { 2604cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(mCount.get()); 261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLoadedCount); 262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLastCount); 263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mUnpluggedCount); 264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void unplug(long batteryUptime, long batteryRealtime) { 2674cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount; 2684cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mPluggedCount); 269617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void plug(long batteryUptime, long batteryRealtime) { 2724cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mPluggedCount = mCount.get(); 273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * Writes a possibly null Counter to a Parcel. 277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param out the Parcel to be written to. 279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param counter a Counter, or null. 280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static void writeCounterToParcel(Parcel out, Counter counter) { 282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (counter == null) { 283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); // indicates null 284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return; 285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); // indicates non-null 287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn counter.writeToParcel(out); 289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 292c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int val; 294617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_LAST) { 295617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val = mLastCount; 296617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 2974cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate val = mCount.get(); 298617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_UNPLUGGED) { 299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mUnpluggedCount; 300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else if (which != STATS_TOTAL) { 301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mLoadedCount; 302617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 303617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 304617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return val; 306617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 307617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 308617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void logState(Printer pw, String prefix) { 3094cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate pw.println(prefix + "mCount=" + mCount.get() 310617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 311617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mUnpluggedCount=" + mUnpluggedCount 312617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mPluggedCount=" + mPluggedCount); 313617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 314617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 3154cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate void stepAtomic() { 3164cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.incrementAndGet(); 317617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 318617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 319617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void writeSummaryFromParcelLocked(Parcel out) { 3204cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate int count = mCount.get(); 3214cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(count); 3224cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate out.writeInt(count - mLoadedCount); 323617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 324617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 325617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void readSummaryFromParcelLocked(Parcel in) { 3264cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mLoadedCount = in.readInt(); 3274cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.set(mLoadedCount); 328617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLastCount = in.readInt(); 3294cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUnpluggedCount = mPluggedCount = mLoadedCount; 330617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 331617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 332e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 333e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public static class SamplingCounter extends Counter { 334e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 335e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) { 336e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables, in); 337e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 338e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 339e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter(ArrayList<Unpluggable> unpluggables) { 340e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani super(unpluggables); 341e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 342e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3434cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void addCountAtomic(long count) { 3444cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mCount.addAndGet((int)count); 345e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 346e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 347e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 348617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for keeping track of timing information. 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 351c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static abstract class Timer extends BatteryStats.Timer implements Unpluggable { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mType; 353c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedCount; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastCount; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedCount; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Times are in microseconds for better accuracy when dividing by the 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock count, and are in "battery realtime" units. 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we have accumulated since the start of the original 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * boot, to the last time something interesting happened in the 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current run. 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTotalTime; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we loaded for the previous runs. Subtract this from 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mTotalTime to find the time for the current run of the system. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTime; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The run time of the last run of the system, as loaded from the 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved data. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastTime; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value of mTotalTime when unplug() was last called. Subtract 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this from mTotalTime to find the time since the last unplug from 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * power. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedTime; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani /** 390244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * Constructs from a parcel. 391244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param type 392244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param unpluggables 393244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param powerType 394244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param in 395244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani */ 396c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 398c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount = in.readInt(); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedCount = in.readInt(); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastCount = in.readInt(); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = in.readInt(); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = in.readLong(); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTime = in.readLong(); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastTime = in.readLong(); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = in.readLong(); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 410c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 414c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 415c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract long computeRunTimeLocked(long curBatteryRealtime); 416c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 417c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract int computeCurrentCountLocked(); 418c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, long batteryRealtime) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mCount); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedCount); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastCount); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedCount); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRunTimeLocked(batteryRealtime)); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTime); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastTime); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedTime); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedTime=" + mUnpluggedTime 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedCount=" + mUnpluggedCount); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = computeRunTimeLocked(batteryRealtime); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = mCount; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": new mUnpluggedTime=" + mUnpluggedTime 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new mUnpluggedCount=" + mUnpluggedCount); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 447c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 448c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime 449c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " old mTotalTime=" + mTotalTime); 450c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 451c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = computeRunTimeLocked(batteryRealtime); 452c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = computeCurrentCountLocked(); 453c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 454c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType 455c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + ": new mTotalTime=" + mTotalTime); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a possibly null Timer to a Parcel. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer, or null. 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void writeTimerToParcel(Parcel out, Timer timer, 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer == null) { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); // indicates null 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); // indicates non-null 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timer.writeToParcel(out, batteryRealtime); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long getTotalTimeLocked(long batteryRealtime, int which) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastTime; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = computeRunTimeLocked(batteryRealtime); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedTime; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which != STATS_TOTAL) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedTime; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastCount; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 499c64edde69d18498fb2954f71a546357b07ab996aEvan Millar val = computeCurrentCountLocked(); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedCount; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which != STATS_TOTAL) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedCount; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 510627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void logState(Printer pw, String prefix) { 511c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + " mCount=" + mCount 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedCount=" + mUnpluggedCount); 514627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mTotalTime=" + mTotalTime 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedTime=" + mLoadedTime); 516627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mLastTime=" + mLastTime 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedTime=" + mUnpluggedTime); 518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 520c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long runTime = computeRunTimeLocked(batteryRealtime); 523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Divide by 1000 for backwards compatibility 524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong((runTime + 500) / 1000); 525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(((runTime - mLoadedTime) + 500) / 1000); 526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount); 527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount - mLoadedCount); 528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 529c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 531c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Multiply by 1000 for backwards compatibility 532c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = mLoadedTime = in.readLong() * 1000; 533c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mLastTime = in.readLong() * 1000; 534c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedTime = mTotalTime; 535c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = mLoadedCount = in.readInt(); 536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mLastCount = in.readInt(); 537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedCount = mCount; 538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class SamplingTimer extends Timer { 542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported count from /proc/wakelocks. 545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mCurrentReportedCount; 547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported count from /proc/wakelocks when unplug() was last 550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 551c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUnpluggedReportedCount; 553c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported total_time from /proc/wakelocks. 556c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mCurrentReportedTotalTime; 558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported total_time from /proc/wakelocks when unplug() was last 562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 563c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 564c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUnpluggedReportedTotalTime; 565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 567c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently in a discharge cycle. 568c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 569c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mInDischarge; 570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently recording reported values. 573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mTrackingReportedValues; 575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * A sequnce counter, incremented once for each update of the stats. 578c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 579c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUpdateVersion; 580c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 581c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) { 582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables, in); 583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = in.readInt(); 584c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = in.readInt(); 585c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = in.readLong(); 586c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = in.readLong(); 587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, 592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean trackReportedValues) { 593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables); 594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = trackReportedValues; 595c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 597c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 598c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setStale() { 599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = false; 600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = 0; 601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = 0; 602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 603c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setUpdateVersion(int version) { 605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateVersion = version; 606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getUpdateVersion() { 609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUpdateVersion; 610c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedCount(int count) { 613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedCount == 0) { 614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = count; 616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = count; 620c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedTotalTime(long totalTime) { 623c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedTotalTime == 0) { 624c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 625c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = totalTime; 626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 628c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = totalTime; 630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void unplug(long batteryUptime, long batteryRealtime) { 633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.unplug(batteryUptime, batteryRealtime); 634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mTrackingReportedValues) { 635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime; 636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount; 637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = true; 639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = false; 644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount 649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedCount=" + mUnpluggedReportedCount 650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime 651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime); 652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mTotalTime + (mInDischarge && mTrackingReportedValues 656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0); 657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount + (mInDischarge && mTrackingReportedValues 661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedCount - mUnpluggedReportedCount : 0); 662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mUnpluggedReportedCount); 668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUnpluggedReportedTotalTime); 670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeSummaryFromParcelLocked(out, batteryRealtime); 675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong(); 683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount = in.readInt(); 684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * State for keeping track of timing information. 690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class StopwatchTimer extends Timer { 692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mTimerPool; 693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mNesting; 694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The last time at which we updated the timer. If mNesting is > 0, 698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * subtract this from the current battery time to find the amount of 699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * time we have been running since we last computed an update. 700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUpdateTime; 702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The total time at which the timer was acquired, to determine if 705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * was actually held for an interesting duration. 706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mAcquireTime; 708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 709f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long mTimeout; 710f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 711c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool, 712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables, Parcel in) { 713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables, in); 714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = in.readLong(); 716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool, 719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables) { 720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables); 721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 723c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 724f37447bad3773b62176baa837908daf6edb44273Amith Yamasani void setTimeout(long timeout) { 725f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mTimeout = timeout; 726f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 727f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUpdateTime); 731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mNesting > 0) { 735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "old mUpdateTime=" + mUpdateTime); 737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = batteryRealtime; 740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "new mUpdateTime=" + mUpdateTime); 742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startRunningLocked(BatteryStatsImpl stats) { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting++ == 0) { 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUpdateTime = stats.getBatteryRealtimeLocked( 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.elapsedRealtime() * 1000); 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all currently active timers before adding 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this new one to the pool. 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add this timer to the active pool 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.add(this); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Increment the count 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount++; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAcquireTime = mTotalTime; 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani boolean isRunningLocked() { 77532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return mNesting > 0; 77632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 77732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopRunningLocked(BatteryStatsImpl stats) { 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore attempt to stop a timer that isn't running 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting == 0) { 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (--mNesting == 0) { 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all active counters, scaled by the total 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // active in the pool, before taking this one out of the pool. 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove this timer from the active pool 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.remove(this); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long realtime = SystemClock.elapsedRealtime() * 1000; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 1; 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = computeRunTimeLocked(batteryRealtime); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTotalTime == mAcquireTime) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there was no change in the time, then discard this 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // count. A somewhat cheezy strategy, but hey. 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount--; 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update the total time for all other running Timers with the same type as this Timer 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // due to a change in timer count 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void refreshTimersLocked(final BatteryStatsImpl stats, 815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> pool) { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long realtime = SystemClock.elapsedRealtime() * 1000; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = pool.size(); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>= 0; i--) { 820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer t = pool.get(i); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long heldTime = batteryRealtime - t.mUpdateTime; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (heldTime > 0) { 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mTotalTime += heldTime / N; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mUpdateTime = batteryRealtime; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 831f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) { 832f37447bad3773b62176baa837908daf6edb44273Amith Yamasani curBatteryRealtime = mUpdateTime + mTimeout; 833f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTotalTime + (mNesting > 0 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (curBatteryRealtime - mUpdateTime) 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project / (mTimerPool != null ? mTimerPool.size() : 1) 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : 0); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readSummaryFromParcelLocked(Parcel in) { 846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> readKernelWakelockStats() { 852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] buffer = new byte[4096]; 854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int len; 855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar try { 857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar FileInputStream is = new FileInputStream("/proc/wakelocks"); 858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = is.read(buffer); 859c64edde69d18498fb2954f71a546357b07ab996aEvan Millar is.close(); 860c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 861c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (len > 0) { 862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i=0; i<len; i++) { 864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (buffer[i] == '\0') { 865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = i; 866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar break; 867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.FileNotFoundException e) { 871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.IOException e) { 873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return parseProcWakelocks(buffer, len); 877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> parseProcWakelocks( 880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] wlBuffer, int len) { 881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name; 882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count; 883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long totalTime; 884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int startIndex, endIndex; 885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int numUpdatedWlNames = 0; 886c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 887c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Advance past the first line. 888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 889c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++); 890c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex = i + 1; 891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 892c64edde69d18498fb2954f71a546357b07ab996aEvan Millar synchronized(this) { 893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = mProcWakelockFileStats; 894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 895c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion++; 896c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (endIndex < len) { 897c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (endIndex=startIndex; 898c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0'; 899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex++); 900e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani // Don't go over the end of the buffer 901e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani if (endIndex < len) { 902e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani endIndex++; // endIndex is an exclusive upper bound. 903e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani } 904c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 905c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String[] nameStringArray = mProcWakelocksName; 906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long[] wlData = mProcWakelocksData; 9072098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // Stomp out any bad characters since this is from a circular buffer 9082098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // A corruption is seen sometimes that results in the vm crashing 9092098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani // This should prevent crashes and the line will probably fail to parse 9102098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani for (int j = startIndex; j < endIndex; j++) { 9112098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?'; 9122098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani } 91353b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex, 91453b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null); 9152098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani 916c64edde69d18498fb2954f71a546357b07ab996aEvan Millar name = nameStringArray[0]; 917c64edde69d18498fb2954f71a546357b07ab996aEvan Millar count = (int) wlData[1]; 918c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // convert nanoseconds to microseconds with rounding. 919c64edde69d18498fb2954f71a546357b07ab996aEvan Millar totalTime = (wlData[2] + 500) / 1000; 920c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 92153b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani if (parsed && name.length() > 0) { 922c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (!m.containsKey(name)) { 923c64edde69d18498fb2954f71a546357b07ab996aEvan Millar m.put(name, new KernelWakelockStats(count, totalTime, 924c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion)); 925c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 926c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 927c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kwlStats = m.get(name); 928c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlStats.mVersion == sKernelWakelockUpdateVersion) { 929c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount += count; 930c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime += totalTime; 931c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 932c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount = count; 933c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime = totalTime; 934c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mVersion = sKernelWakelockUpdateVersion; 935c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 936c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 937c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 93853b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani } 939c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex; 940c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 941c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 942c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != numUpdatedWlNames) { 943c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Don't report old data. 944c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Iterator<KernelWakelockStats> itr = m.values().iterator(); 945c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (itr.hasNext()) { 946c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (itr.next().mVersion != sKernelWakelockUpdateVersion) { 947c64edde69d18498fb2954f71a546357b07ab996aEvan Millar itr.remove(); 948c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 949c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 950c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 951c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return m; 952c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 953c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 954c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 955c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private class KernelWakelockStats { 956c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mCount; 957c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long mTotalTime; 958c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mVersion; 959c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 960c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats(int count, long totalTime, int version) { 961c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = count; 962c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = totalTime; 963c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mVersion = version; 964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 965c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 966c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 967c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 968c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Get the KernelWakelockTimer associated with name, and create a new one if one 969c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * doesn't already exist. 970c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 971c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public SamplingTimer getKernelWakelockTimerLocked(String name) { 972c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 973c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 974c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 975c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 976c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 977c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 978c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return kwlt; 979c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 9803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 9813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataPlug(long[] dataTransfer, long currentBytes) { 9823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani dataTransfer[STATS_LAST] = dataTransfer[STATS_UNPLUGGED]; 9833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani dataTransfer[STATS_UNPLUGGED] = -1; 9843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 9853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 9863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private void doDataUnplug(long[] dataTransfer, long currentBytes) { 9873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani dataTransfer[STATS_UNPLUGGED] = currentBytes; 9883718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 9893718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 9903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 9913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Radio uptime in microseconds when transferring data. This value is very approximate. 9923f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @return 9933f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 9943f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private long getCurrentRadioDataUptime() { 9953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani try { 9963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms"); 9973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (!awakeTimeFile.exists()) return 0; 9983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile)); 9993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani String line = br.readLine(); 10003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani br.close(); 10013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return Long.parseLong(line) * 1000; 10023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (NumberFormatException nfe) { 10033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 10043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } catch (IOException ioe) { 10053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Nothing 10063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 10073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return 0; 10083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 10093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 10103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 10113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * @deprecated use getRadioDataUptime 10123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 10133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getRadioDataUptimeMs() { 10143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getRadioDataUptime() / 1000; 10153f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 10163f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 10173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani /** 10183f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani * Returns the duration that the cell radio was up for data transfers. 10193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani */ 10203f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public long getRadioDataUptime() { 10213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (mRadioDataStart == -1) { 10223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return mRadioDataUptime; 10233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 10243f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentRadioDataUptime() - mRadioDataStart; 10253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 10263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 10273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 10283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani private int getCurrentBluetoothPingCount() { 10293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBtHeadset != null) { 10303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return mBtHeadset.getBatteryUsageHint(); 10313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 10323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return -1; 10333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 10343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 10353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public int getBluetoothPingCount() { 10363f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani if (mBluetoothPingStart == -1) { 10373f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return mBluetoothPingCount; 10383f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } else if (mBtHeadset != null) { 10393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani return getCurrentBluetoothPingCount() - mBluetoothPingStart; 10403f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 104182cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani return 0; 10423f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 10433f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 10443f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani public void setBtHeadset(BluetoothHeadset headset) { 104582cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) { 104682cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 104782cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani } 10483f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBtHeadset = headset; 10493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani } 10503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 105132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn void addHistoryRecord(long curTime) { 105232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn BatteryHistoryRecord rec = mHistoryCache; 105332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec != null) { 105432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCache = rec.next; 105532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 105632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec = new BatteryHistoryRecord(); 105732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 105832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec.time = curTime; 105932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec.batteryLevel = mHistoryCur.batteryLevel; 106032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec.states = mHistoryCur.states; 106132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(rec); 106232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 106332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 106432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn void addHistoryRecord(BatteryHistoryRecord rec) { 106532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec.next = null; 106632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mHistoryEnd != null) { 106732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd.next = rec; 106832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd = rec; 106932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } else { 107032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistory = mHistoryEnd = rec; 107132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 107232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 107332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 107432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn void clearHistory() { 107532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mHistory != null) { 107632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryEnd.next = mHistoryCache; 107732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCache = mHistory; 107832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistory = mHistoryEnd = null; 107932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 108032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 108132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void doUnplug(long batteryUptime, long batteryRealtime) { 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 10851719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff u.mStartedTcpBytesReceived = TrafficStats.getUidRxBytes(u.mUid); 10861719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff u.mStartedTcpBytesSent = TrafficStats.getUidTxBytes(u.mUid); 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent; 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime); 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track total mobile data 10941719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mMobileDataRx, TrafficStats.getMobileRxBytes()); 10951719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mMobileDataTx, TrafficStats.getMobileTxBytes()); 10961719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mTotalDataRx, TrafficStats.getTotalRxBytes()); 10971719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataUnplug(mTotalDataTx, TrafficStats.getTotalTxBytes()); 10983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 10993f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataStart = getCurrentRadioDataUptime(); 11003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = 0; 11013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 11023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = getCurrentBluetoothPingCount(); 11033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = 0; 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void doPlug(long batteryUptime, long batteryRealtime) { 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesReceived >= 0) { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived(); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesReceived = -1; 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesSent >= 0) { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent(); 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesSent = -1; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).plug(batteryUptime, batteryRealtime); 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11211719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mMobileDataRx, TrafficStats.getMobileRxBytes()); 11221719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mMobileDataTx, TrafficStats.getMobileTxBytes()); 11231719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mTotalDataRx, TrafficStats.getTotalRxBytes()); 11241719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff doDataPlug(mTotalDataTx, TrafficStats.getTotalTxBytes()); 11253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Track radio awake time 11263f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mRadioDataUptime = getRadioDataUptime(); 11273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 11283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 11293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani // Track bt headset ping count 11303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = getBluetoothPingCount(); 11313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 113432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mGpsNesting; 113532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 113732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 113832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_GPS_ON_FLAG; 113932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: " 114032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 114132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 114232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 114332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting++; 11442e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStartGps(); 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 114832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting--; 114932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mGpsNesting == 0) { 115032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_GPS_ON_FLAG; 115132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: " 115232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 115332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 115432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 11552e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteStopGps(); 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11573718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOnLocked() { 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mScreenOn) { 116032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_SCREEN_ON_FLAG; 116132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " 116232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 116332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 116432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mGpsNesting++; 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = true; 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.startRunningLocked(this); 1167617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1168617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this); 1169617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOffLocked() { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mScreenOn) { 117532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_SCREEN_ON_FLAG; 117632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: " 117732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 117832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.stopRunningLocked(this); 1181617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1182617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1183617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1184617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1185617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1186617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1187617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightnessLocked(int brightness) { 1188617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Bin the brightness. 1189617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS); 1190617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (bin < 0) bin = 0; 1191617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1; 1192617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin != bin) { 119332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~BatteryHistoryRecord.STATE_SCREEN_MASK) 119432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn | (bin << BatteryHistoryRecord.STATE_SCREEN_SHIFT); 119532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: " 119632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 119732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenOn) { 1199617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 1200617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 1201617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1202617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[bin].startRunningLocked(this); 1203617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessBin = bin; 1205617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1206617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1207617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 12084cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate public void noteInputEventAtomic() { 12094cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mInputEventCounter.stepAtomic(); 1210617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1211617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int uid, int event) { 12132e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteUserActivityLocked(event); 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOnLocked() { 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPhoneOn) { 121832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_PHONE_ON_FLAG; 121932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: " 122032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 122132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = true; 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.startRunningLocked(this); 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOffLocked() { 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPhoneOn) { 122932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_PHONE_ON_FLAG; 123032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: " 123132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 123232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.stopRunningLocked(this); 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 123732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 1238f37447bad3773b62176baa837908daf6edb44273Amith Yamasani /** 1239f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * Telephony stack updates the phone state. 1240f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * @param state phone state from ServiceState.getState() 1241f37447bad3773b62176baa837908daf6edb44273Amith Yamasani */ 1242f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneStateLocked(int state) { 1243f37447bad3773b62176baa837908daf6edb44273Amith Yamasani int bin = mPhoneSignalStrengthBin; 1244f37447bad3773b62176baa837908daf6edb44273Amith Yamasani boolean isAirplaneMode = state == ServiceState.STATE_POWER_OFF; 1245f37447bad3773b62176baa837908daf6edb44273Amith Yamasani // Stop all timers 1246f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (isAirplaneMode || state == ServiceState.STATE_OUT_OF_SERVICE) { 1247f37447bad3773b62176baa837908daf6edb44273Amith Yamasani for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) { 1248f37447bad3773b62176baa837908daf6edb44273Amith Yamasani while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) { 1249f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalStrengthsTimer[i].stopRunningLocked(this); 125032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 125132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 125232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 1253f37447bad3773b62176baa837908daf6edb44273Amith Yamasani // Stop Signal Scanning timer, in case we're going into service 1254f37447bad3773b62176baa837908daf6edb44273Amith Yamasani while (mPhoneSignalScanningTimer.isRunningLocked()) { 1255f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.stopRunningLocked(this); 1256f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1257f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 1258f37447bad3773b62176baa837908daf6edb44273Amith Yamasani // If we're back in service or continuing in service, restart the old timer. 1259f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (state == ServiceState.STATE_IN_SERVICE) { 1260f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (bin == -1) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1261f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) { 1262f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 1263f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1264f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } else if (state == ServiceState.STATE_OUT_OF_SERVICE) { 1265f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalStrengthBin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1266f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (!mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].isRunningLocked()) { 1267f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].startRunningLocked(this); 1268f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1269f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (!mPhoneSignalScanningTimer.isRunningLocked()) { 1270f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.startRunningLocked(this); 1271f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1272f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 127332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 127432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mPhoneServiceState != state) { 127532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~BatteryHistoryRecord.STATE_PHONE_STATE_MASK) 127632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn | (state << BatteryHistoryRecord.STATE_PHONE_STATE_SHIFT); 127732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + bin + " to: " 127832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 127932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 128032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mPhoneServiceState = state; 128132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 128232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 128332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 1284e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) { 1285627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Bin the strength. 1286627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin; 1287f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mPhoneServiceState == ServiceState.STATE_POWER_OFF 1288f37447bad3773b62176baa837908daf6edb44273Amith Yamasani || mPhoneServiceState == ServiceState.STATE_OUT_OF_SERVICE) { 1289f37447bad3773b62176baa837908daf6edb44273Amith Yamasani // Ignore any signal strength changes when radio was turned off or out of service. 1290f37447bad3773b62176baa837908daf6edb44273Amith Yamasani return; 1291f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1292e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (!signalStrength.isGsm()) { 1293e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int dBm = signalStrength.getCdmaDbm(); 1294f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (dBm >= -75) bin = SIGNAL_STRENGTH_GREAT; 1295f37447bad3773b62176baa837908daf6edb44273Amith Yamasani else if (dBm >= -85) bin = SIGNAL_STRENGTH_GOOD; 1296f37447bad3773b62176baa837908daf6edb44273Amith Yamasani else if (dBm >= -95) bin = SIGNAL_STRENGTH_MODERATE; 1297f37447bad3773b62176baa837908daf6edb44273Amith Yamasani else if (dBm >= -100) bin = SIGNAL_STRENGTH_POOR; 1298f37447bad3773b62176baa837908daf6edb44273Amith Yamasani else bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1299e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } else { 1300e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int asu = signalStrength.getGsmSignalStrength(); 1301e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1302e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT; 1303e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 8) bin = SIGNAL_STRENGTH_GOOD; 1304e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 4) bin = SIGNAL_STRENGTH_MODERATE; 1305e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else bin = SIGNAL_STRENGTH_POOR; 1306e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneSignalStrengthBin != bin) { 130832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~BatteryHistoryRecord.STATE_SIGNAL_STRENGTH_MASK) 130932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn | (bin << BatteryHistoryRecord.STATE_SIGNAL_STRENGTH_SHIFT); 131032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: " 131132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 131232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1313627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneSignalStrengthBin >= 0) { 1314627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this); 1315627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1316627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthBin = bin; 1317627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 1318627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1319627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1320627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1321627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) { 1322627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin = DATA_CONNECTION_NONE; 1323627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (hasData) { 1324627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn switch (dataType) { 1325627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_EDGE: 1326627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_EDGE; 1327627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1328627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_GPRS: 1329627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_GPRS; 1330627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1331627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_UMTS: 1332627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_UMTS; 1333627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1334627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn default: 1335627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_OTHER; 1336627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1337627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1338627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 13393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData); 1340627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType != bin) { 134132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states = (mHistoryCur.states&~BatteryHistoryRecord.STATE_DATA_CONNECTION_MASK) 134232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn | (bin << BatteryHistoryRecord.STATE_DATA_CONNECTION_SHIFT); 134332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: " 134432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 134532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1346627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType >= 0) { 1347627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this); 1348627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1349627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionType = bin; 1350627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[bin].startRunningLocked(this); 1351627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1352627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1353627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiOnLocked(int uid) { 1355105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mWifiOn) { 135632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_ON_FLAG; 135732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: " 135832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 135932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = true; 1361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.startRunningLocked(this); 1362105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid != uid) { 1364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 13652e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked(); 1366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1367617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = uid; 13682e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiTurnedOnLocked(); 1369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1370105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1371105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiOffLocked(int uid) { 1373105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mWifiOn) { 137432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_ON_FLAG; 137532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: " 137632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 137732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1378105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 1379105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.stopRunningLocked(this); 1380105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 13822e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked(); 1383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = -1; 1384617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1385105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1386244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1387244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOnLocked(int uid) { 1388244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioOn) { 138932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_AUDIO_ON_FLAG; 139032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: " 139132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 139232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1393244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = true; 1394244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.startRunningLocked(this); 1395244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 13962e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOnLocked(); 1397244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1398105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1399244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOffLocked(int uid) { 1400244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioOn) { 140132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_AUDIO_ON_FLAG; 140232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " 140332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 140432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1405244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = false; 1406244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.stopRunningLocked(this); 1407244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 14082e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteAudioTurnedOffLocked(); 1409244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1410244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1411244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOnLocked(int uid) { 1412244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoOn) { 141332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_VIDEO_ON_FLAG; 141432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: " 141532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 141632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1417244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = true; 1418244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.startRunningLocked(this); 1419244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 14202e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOnLocked(); 1421244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1422244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1423244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOffLocked(int uid) { 1424244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoOn) { 142532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_VIDEO_ON_FLAG; 142632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " 142732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 142832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1429244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = false; 1430244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.stopRunningLocked(this); 1431244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 14322e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteVideoTurnedOffLocked(); 1433244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1434244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1435d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public void noteWifiRunningLocked() { 1436d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood if (!mWifiRunning) { 143732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_RUNNING_FLAG; 143832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: " 143932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 144032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1441d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = true; 1442d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.startRunningLocked(this); 1443d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1444d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1445d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1446d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public void noteWifiStoppedLocked() { 1447d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood if (mWifiRunning) { 144832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_RUNNING_FLAG; 144932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: " 145032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 145132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1452d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 1453d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.stopRunningLocked(this); 1454d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1455d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1456d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1457105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOnLocked() { 1458105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mBluetoothOn) { 145932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_BLUETOOTH_ON_FLAG; 146032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: " 146132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 146232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1463105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = true; 1464105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.startRunningLocked(this); 1465105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1466105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1467105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1468105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOffLocked() { 1469105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mBluetoothOn) { 147032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_BLUETOOTH_ON_FLAG; 147132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: " 147232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 147332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 1474105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 1475105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.stopRunningLocked(this); 1476105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1477105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1478105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 147932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiFullLockNesting = 0; 148032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 1481105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked(int uid) { 148232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 148332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_FULL_LOCK_FLAG; 148432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: " 148532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 148632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 148732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 148832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting++; 14892e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked(); 1490105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1491105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1492105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked(int uid) { 149332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiFullLockNesting--; 149432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiFullLockNesting == 0) { 149532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_FULL_LOCK_FLAG; 149632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: " 149732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 149832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 149932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 15002e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteFullWifiLockReleasedLocked(); 1501105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1502105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 150332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiScanLockNesting = 0; 150432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 1505105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked(int uid) { 150632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiScanLockNesting == 0) { 150732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_SCAN_LOCK_FLAG; 150832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: " 150932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 151032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 151132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 151232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiScanLockNesting++; 15132e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked(); 1514105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1515105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1516105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked(int uid) { 151732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiScanLockNesting--; 151832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiScanLockNesting == 0) { 151932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_SCAN_LOCK_FLAG; 152032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: " 152132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 152232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 152332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 15242e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteScanWifiLockReleasedLocked(); 1525105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 15265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 152732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn int mWifiMulticastNesting = 0; 152832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 15295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked(int uid) { 153032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 153132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_MULTICAST_ON_FLAG; 153232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: " 153332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 153432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 153532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 153632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting++; 15372e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastEnabledLocked(); 15385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 15395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 15405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked(int uid) { 154132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mWifiMulticastNesting--; 154232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mWifiMulticastNesting == 0) { 154332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_MULTICAST_ON_FLAG; 154432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: " 154532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 154632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 154732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 15482e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn getUidStatsLocked(uid).noteWifiMulticastDisabledLocked(); 15495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 15505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getScreenOnTime(long batteryRealtime, int which) { 1552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which); 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1555617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public long getScreenBrightnessTime(int brightnessBin, 1556617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long batteryRealtime, int which) { 1557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked( 1558617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn batteryRealtime, which); 1559617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1560244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1561617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getInputEventCount(int which) { 1562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mInputEventCounter.getCountLocked(which); 1563617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1564617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getPhoneOnTime(long batteryRealtime, int which) { 1566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which); 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1568244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1569627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneSignalStrengthTime(int strengthBin, 1570627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 1571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked( 1572627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 1573627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1574f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 1575f37447bad3773b62176baa837908daf6edb44273Amith Yamasani @Override public long getPhoneSignalScanningTime( 1576f37447bad3773b62176baa837908daf6edb44273Amith Yamasani long batteryRealtime, int which) { 1577f37447bad3773b62176baa837908daf6edb44273Amith Yamasani return mPhoneSignalScanningTimer.getTotalTimeLocked( 1578f37447bad3773b62176baa837908daf6edb44273Amith Yamasani batteryRealtime, which); 1579f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 1580f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 1581617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneSignalStrengthCount(int dataType, int which) { 1582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 1583617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1584617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1585627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneDataConnectionTime(int dataType, 1586627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 1587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked( 1588627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 1589627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1590627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1591617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneDataConnectionCount(int dataType, int which) { 1592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 1593617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1595105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getWifiOnTime(long batteryRealtime, int which) { 1596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which); 1597105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1598105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1599d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood @Override public long getWifiRunningTime(long batteryRealtime, int which) { 1600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 1601d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1602d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1603105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getBluetoothOnTime(long batteryRealtime, int which) { 1604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which); 1605105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean getIsOnBattery() { 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() { 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUidStats; 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular uid. 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Uid extends BatteryStats.Uid { 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mUid; 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesReceived; 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesSent; 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesReceived; 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesSent; 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesReceivedAtLastUnplug; 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesSentAtLastUnplug; 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are not saved/restored when parcelling, since we want 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to return from the parcel with a snapshot of the state. 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesReceived = -1; 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesSent = -1; 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1633617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn boolean mWifiTurnedOn; 1634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiTurnedOnTimer; 1635617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1636105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mFullWifiLockOut; 1637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mFullWifiLockTimer; 1638105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mScanWifiLockOut; 1640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScanWifiLockTimer; 1641244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 16425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt boolean mWifiMulticastEnabled; 16435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt StopwatchTimer mWifiMulticastTimer; 1644244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioTurnedOn; 1646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioTurnedOnTimer; 1647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoTurnedOn; 1649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoTurnedOnTimer; 16505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 1651617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter[] mUserActivityCounters; 1652617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's wake locks. 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>(); 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's sensor activations. 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>(); 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>(); 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>(); 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid(int uid) { 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUid = uid; 1675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables); 1676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables); 1677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables); 16785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED, 16795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt null, mUnpluggables); 1680244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables); 1681244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables); 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() { 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWakelockStats; 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() { 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSensorStats; 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() { 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProcessStats; 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() { 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageStats; 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1703eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1704eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getUid() { 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUid; 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1708eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1709eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesReceived(int which) { 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesReceived; 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesReceived(); 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesReceivedAtLastUnplug; 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_TOTAL) { 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesReceived; 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesReceived() { 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0 17261719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff ? (TrafficStats.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0); 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1728eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 1729eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesSent(int which) { 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesSent; 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesSent(); 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesSentAtLastUnplug; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_TOTAL) { 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesSent; 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1744105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1745617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiTurnedOnLocked() { 1746617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (!mWifiTurnedOn) { 1747617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOn = true; 1748617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 1749617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1750617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1751617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1752617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1753617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiTurnedOffLocked() { 1754617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiTurnedOn) { 1755617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOn = false; 1756617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 1757617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1758617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1759617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1760617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1761105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked() { 1762105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mFullWifiLockOut) { 1763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = true; 1764105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 1765105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1766105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1767105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1768105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1769244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoTurnedOnLocked() { 1770244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoTurnedOn) { 1771244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOn = true; 1772244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 1773244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1774244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1775244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1776244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1777244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoTurnedOffLocked() { 1778244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoTurnedOn) { 1779244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOn = false; 1780244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 1781244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1782244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1783244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1784244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1785244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioTurnedOnLocked() { 1786244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioTurnedOn) { 1787244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOn = true; 1788244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 1789244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1790244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1791244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1792244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1793244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioTurnedOffLocked() { 1794244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioTurnedOn) { 1795244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOn = false; 1796244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 1797244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1798244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1799244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1800244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1801105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked() { 1802105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mFullWifiLockOut) { 1803105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 1804105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 1805105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1806105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1807105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked() { 1810105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mScanWifiLockOut) { 1811105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = true; 1812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 1813105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1815105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked() { 1818105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mScanWifiLockOut) { 1819105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 1820105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 1821105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1822105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 18235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 18245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 18255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked() { 18265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (!mWifiMulticastEnabled) { 18275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = true; 18285347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this); 18295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 18305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 18315347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 18325347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 18335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked() { 18345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (mWifiMulticastEnabled) { 18355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 18365347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this); 18375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 18385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 18395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 1840617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1841617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public long getWifiTurnedOnTime(long batteryRealtime, int which) { 1842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 1843617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1844244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1845244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1846244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public long getAudioTurnedOnTime(long batteryRealtime, int which) { 1847244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 1848244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1849244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1850244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1851244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public long getVideoTurnedOnTime(long batteryRealtime, int which) { 1852244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 1853244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1854244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1855105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1856105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getFullWifiLockTime(long batteryRealtime, int which) { 1857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 1858105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1859105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1860105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1861105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getScanWifiLockTime(long batteryRealtime, int which) { 1862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 1863105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 18645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 18655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 18665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public long getWifiMulticastTime(long batteryRealtime, int which) { 18675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime, 18685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt which); 18695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 18705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 1871617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1872617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int type) { 1873617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 1874617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn initUserActivityLocked(); 1875617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1876617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (type < 0) type = 0; 1877617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1; 18784cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mUserActivityCounters[type].stepAtomic(); 1879617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1880617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1881617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1882617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public boolean hasUserActivity() { 1883617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return mUserActivityCounters != null; 1884617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1885617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1886617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1887617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public int getUserActivityCount(int type, int which) { 1888617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 1889617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return 0; 1890617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUserActivityCounters[type].getCountLocked(which); 1892617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1893617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1894617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void initUserActivityLocked() { 1895617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 1896617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 1897617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables); 1898617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1899617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1900617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesSent() { 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0 19031719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff ? (TrafficStats.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0); 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1905244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakelockStats.size()); 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) { 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(wakelockEntry.getKey()); 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = wakelockEntry.getValue(); 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.writeToParcelLocked(out, batteryRealtime); 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mSensorStats.size()); 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) { 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(sensorEntry.getKey()); 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = sensorEntry.getValue(); 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.writeToParcelLocked(out, batteryRealtime); 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mProcessStats.size()); 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) { 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(procEntry.getKey()); 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = procEntry.getValue(); 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.writeToParcelLocked(out); 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mPackageStats.size()); 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) { 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(pkgEntry.getKey()); 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = pkgEntry.getValue(); 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.writeToParcelLocked(out); 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesReceived); 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesSent); 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesReceived()); 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesSent()); 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesReceivedAtLastUnplug); 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesSentAtLastUnplug); 1941617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime); 1942105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.writeToParcel(out, batteryRealtime); 1943244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime); 1944244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime); 1945105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.writeToParcel(out, batteryRealtime); 19465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.writeToParcel(out, batteryRealtime); 1947617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 1948617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 1949617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 1950617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 1951617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 1952617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i].writeToParcel(out); 1953617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1954617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numWakelocks = in.readInt(); 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.clear(); 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < numWakelocks; j++) { 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wakelockName = in.readString(); 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = new Wakelock(); 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.readFromParcelLocked(unpluggables, in); 19649e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) { 19659e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // We will just drop some random set of wakelocks if 19669e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // the previous run of the system was an older version 19679e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn // that didn't impose a limit. 19689e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn mWakelockStats.put(wakelockName, wakelock); 19699e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numSensors = in.readInt(); 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.clear(); 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numSensors; k++) { 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = in.readInt(); 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = new Sensor(sensorNumber); 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.readFromParcelLocked(mUnpluggables, in); 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensorNumber, sensor); 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numProcs = in.readInt(); 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.clear(); 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numProcs; k++) { 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String processName = in.readString(); 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = new Proc(); 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.readFromParcelLocked(in); 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(processName, proc); 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numPkgs = in.readInt(); 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.clear(); 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int l = 0; l < numPkgs; l++) { 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = in.readString(); 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = new Pkg(); 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.readFromParcelLocked(in); 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(packageName, pkg); 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesReceived = in.readLong(); 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesSent = in.readLong(); 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesReceived = in.readLong(); 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesSent = in.readLong(); 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesReceivedAtLastUnplug = in.readLong(); 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesSentAtLastUnplug = in.readLong(); 2005617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOn = false; 2006c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables, in); 2007105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 2008c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables, in); 2009244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOn = false; 2010244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables, in); 2011244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOn = false; 2012244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables, in); 2013105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 2014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables, in); 20155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 20165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED, 20175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt null, mUnpluggables, in); 2018617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() == 0) { 2019617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = null; 2020617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 2021617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 2022617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 2023617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables, in); 2024617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2025617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular wake lock. 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Wakelock extends BatteryStats.Uid.Wakelock { 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device partially awake. 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerPartial; 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device fully awake. 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerFull; 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has had a window keeping the device awake. 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerWindow; 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a possibly null Timer from a Parcel. The timer is associated with the 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proper timer pool from the given BatteryStatsImpl object. 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in the Parcel to be read from. 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return a new Timer, or null. 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2054c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool, 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<Unpluggable> unpluggables, Parcel in) { 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return new StopwatchTimer(type, pool, unpluggables, in); 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers, unpluggables, in); 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers, unpluggables, in); 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers, unpluggables, in); 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime); 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime); 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime); 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getWakeTime(int type) { 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: return mTimerFull; 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: return mTimerPartial; 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: return mTimerWindow; 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: throw new IllegalArgumentException("type = " + type); 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Sensor extends BatteryStats.Uid.Sensor { 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mHandle; 2091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimer; 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Sensor(int handle) { 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandle = handle; 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables, 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in) { 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle); 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool == null) { 2105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pool = new ArrayList<StopwatchTimer>(); 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(mHandle, pool); 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2108c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return new StopwatchTimer(0, pool, unpluggables, in); 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimer = readTimerFromParcel(unpluggables, in); 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimer, batteryRealtime); 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getSensorTime() { 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTimer; 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2123eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2124eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHandle() { 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHandle; 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable { 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in user code. 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUserTime; 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in kernel code. 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSystemTime; 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times the process has been started. 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2150eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * Amount of time the process was running in the foreground. 2151eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 2152eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mForegroundTime; 2153eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2154eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from a previous save. 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedUserTime; 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from a previous save. 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedSystemTime; 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from a previous save. 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2170eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from a previous save. 2171eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 2172eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLoadedForegroundTime; 2173eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2174eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from the previous run. 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUserTime; 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from the previous run. 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastSystemTime; 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from the previous run. 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2190eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time loaded from the previous run 2191eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 2192eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mLastForegroundTime; 2193eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2194eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time when last unplugged. 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedUserTime; 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time when last unplugged. 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedSystemTime; 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started before unplugged. 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** 2210eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani * The amount of foreground time since unplugged. 2211eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani */ 2212eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long mUnpluggedForegroundTime; 2213eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2214e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani SamplingCounter[] mSpeedBins; 2215e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc() { 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 2218e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mSpeedBins = new SamplingCounter[getCpuSpeedSteps()]; 2219e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length; i++) { 2220e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mSpeedBins[i] = new SamplingCounter(mUnpluggables); 2221e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2223e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = mUserTime; 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = mSystemTime; 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 2228eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = mForegroundTime; 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 2235105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 2236105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 2237105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUserTime); 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mSystemTime); 2240eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mForegroundTime); 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedUserTime); 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedSystemTime); 2244eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mLoadedForegroundTime); 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastUserTime); 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastSystemTime); 2248eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mLastForegroundTime); 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastStarts); 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedUserTime); 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedSystemTime); 2252eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani out.writeLong(mUnpluggedForegroundTime); 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 2254e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 2255e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(mSpeedBins.length); 2256e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length; i++) { 2257e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mSpeedBins[i].writeToParcel(out); 2258e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime = in.readLong(); 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime = in.readLong(); 2264eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime = in.readLong(); 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedUserTime = in.readLong(); 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedSystemTime = in.readLong(); 2268eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mLoadedForegroundTime = in.readLong(); 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUserTime = in.readLong(); 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastSystemTime = in.readLong(); 2272eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mLastForegroundTime = in.readLong(); 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastStarts = in.readInt(); 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = in.readLong(); 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = in.readLong(); 2276eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mUnpluggedForegroundTime = in.readLong(); 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 2278e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 2279e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani int bins = in.readInt(); 2280e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mSpeedBins = new SamplingCounter[bins]; 2281e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < bins; i++) { 2282e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mSpeedBins[i] = new SamplingCounter(mUnpluggables, in); 2283e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCpuTimeLocked(int utime, int stime) { 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime += utime; 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime += stime; 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2295eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public void addForegroundTimeLocked(long ttime) { 2296eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani mForegroundTime += ttime; 2297eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 2298eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incStartsLocked() { 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getUserTime(int which) { 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastUserTime; 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mUserTime; 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedUserTime; 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedUserTime; 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSystemTime(int which) { 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastSystemTime; 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mSystemTime; 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedSystemTime; 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedSystemTime; 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2336eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public long getForegroundTime(int which) { 2337eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani long val; 2338eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_LAST) { 2339eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mLastForegroundTime; 2340eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } else { 2341eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val = mForegroundTime; 2342eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (which == STATS_CURRENT) { 2343eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mLoadedForegroundTime; 2344eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } else if (which == STATS_UNPLUGGED) { 2345eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani val -= mUnpluggedForegroundTime; 2346eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 2347eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 2348eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani return val; 2349eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 2350eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 2351eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani @Override 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2366e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 2367e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /* Called by ActivityManagerService when CPU times are updated. */ 2368e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void addSpeedStepTimes(long[] values) { 2369e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mSpeedBins.length && i < values.length; i++) { 23704cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mSpeedBins[i].addCountAtomic(values[i]); 2371e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 2372e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 2373e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 2374e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 2375e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public long getTimeAtCpuSpeedStep(int speedStep, int which) { 2376e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (speedStep < mSpeedBins.length) { 2377e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return mSpeedBins[speedStep].getCountLocked(which); 2378e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } else { 2379e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return 0; 2380e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 2381e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable { 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times this package has done something that could wake up the 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mWakeups; 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device loaded from a 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous save. 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedWakeups; 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastWakeups; 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedWakeups; 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statics we have collected for this package's services. 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>(); 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg() { 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = mWakeups; 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups = in.readInt(); 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedWakeups = in.readInt(); 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWakeups = in.readInt(); 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = in.readInt(); 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numServs = in.readInt(); 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.clear(); 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int m = 0; m < numServs; m++) { 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String serviceName = in.readString(); 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = new Serv(); 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.put(serviceName, serv); 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.readFromParcelLocked(in); 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakeups); 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedWakeups); 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastWakeups); 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedWakeups); 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mServiceStats.size()); 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) { 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(servEntry.getKey()); 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = servEntry.getValue(); 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.writeToParcelLocked(out); 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() { 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServiceStats; 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWakeups(int which) { 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastWakeups; 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mWakeups; 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedWakeups; 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedWakeups; 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable { 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left started. 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartTime; 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been started and not yet stopped, this is 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started. 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRunningSince; 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently running. 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning; 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number of times startService() has been called. 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left launched. 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedTime; 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been launched and not yet exited, this is 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was launched (ms in battery uptime). 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedSince; 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently launched. 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLaunched; 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number times the service has been launched. 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLaunches; 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started loaded from a previous save 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (ms in battery uptime). 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedStartTime; 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts loaded from a previous save. 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches loaded from a previous save. 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedLaunches; 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started as of the last run (ms 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastStartTime; 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts as of the last run. 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches as of the last run. 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastLaunches; 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started when last unplugged (ms 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedStartTime; 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts when last unplugged. 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches when last unplugged. 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedLaunches; 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Serv() { 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime); 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = mLaunches; 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime = in.readLong(); 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = in.readLong(); 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = in.readInt() != 0; 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime = in.readLong(); 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = in.readLong(); 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = in.readInt() != 0; 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches = in.readInt(); 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStartTime = in.readLong(); 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedLaunches = in.readInt(); 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastStartTime = in.readLong(); 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastStarts = in.readInt(); 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastLaunches = in.readInt(); 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = in.readLong(); 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = in.readInt(); 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mStartTime); 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRunningSince); 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mRunning ? 1 : 0); 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedTime); 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedSince); 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunched ? 1 : 0); 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunches); 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedStartTime); 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedLaunches); 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastStartTime); 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastStarts); 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastLaunches); 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedStartTime); 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedLaunches); 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getLaunchTimeToNowLocked(long batteryUptime) { 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) return mLaunchedTime; 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLaunchedTime + batteryUptime - mLaunchedSince; 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getStartTimeToNowLocked(long batteryUptime) { 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) return mStartTime; 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartTime + batteryUptime - mRunningSince; 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLaunchedLocked() { 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) { 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches++; 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = getBatteryUptimeLocked(); 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = true; 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopLaunchedLocked() { 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLaunched) { 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mLaunchedSince; 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime += time; 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches--; 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = false; 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startRunningLocked() { 26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) { 26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = getBatteryUptimeLocked(); 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopRunningLocked() { 26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRunning) { 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mRunningSince; 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime += time; 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts--; 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = false; 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLaunches(int which) { 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastLaunches; 26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLaunches; 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedLaunches; 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedLaunches; 26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getStartTime(long now, int which) { 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStartTime; 27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = getStartTimeToNowLocked(now); 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStartTime; 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStartTime; 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incWakeupsLocked() { 27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups++; 27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Serv newServiceStatsLocked() { 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Serv(); 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Proc getProcessStatsLocked(String name) { 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc ps = mProcessStats.get(name); 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Proc(); 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(name, ps); 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg getPackageStatsLocked(String name) { 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = mPackageStats.get(name); 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Pkg(); 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(name, ps); 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg.Serv getServiceStatsLocked(String pkg, String serv) { 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = getPackageStatsLocked(pkg); 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg.Serv ss = ps.mServiceStats.get(serv); 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ss == null) { 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss = ps.newServiceStatsLocked(); 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps.mServiceStats.put(serv, ss); 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2792c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getWakeTimerLocked(String name, int type) { 27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Wakelock wl = mWakelockStats.get(name); 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl == null) { 27959e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) { 27969e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn name = BATCHED_WAKELOCK_NAME; 27979e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = mWakelockStats.get(name); 27989e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 27999e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn if (wl == null) { 28009e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn wl = new Wakelock(); 28019e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn mWakelockStats.put(name, wl); 28029e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn } 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = null; 28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerPartial; 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 2809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(WAKE_TYPE_PARTIAL, mPartialTimers, mUnpluggables); 28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial = t; 28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: 28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerFull; 28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 2816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(WAKE_TYPE_FULL, mFullTimers, mUnpluggables); 28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull = t; 28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: 28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerWindow; 28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 2823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(WAKE_TYPE_WINDOW, mWindowTimers, mUnpluggables); 28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow = t; 28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("type=" + type); 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) { 28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sensor se = mSensorStats.get(sensor); 28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se == null) { 28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!create) { 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se = new Sensor(sensor); 28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensor, se); 28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = se.mTimer; 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor); 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timers == null) { 2847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar timers = new ArrayList<StopwatchTimer>(); 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(sensor, timers); 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(BatteryStats.SENSOR, timers, mUnpluggables); 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer = t; 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartWakeLocked(String name, int type) { 2856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopWakeLocked(String name, int type) { 2863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int sensor) { 2870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, true); 28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int sensor) { 28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't create a timer if one doesn't already exist 2878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, false); 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps() { 2885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true); 28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps() { 2892c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false); 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 2895244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(String filename) { 29041afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = new JournaledFile(new File(filename), new File(filename + ".tmp")); 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 2906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables); 2907617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 2908c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables); 2909617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2910617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables); 2911c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables); 2912627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 2913c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables); 2914627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2915f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer = new StopwatchTimer(-200+1, null, mUnpluggables); 2916627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 2917c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables); 2918627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2919c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiOnTimer = new StopwatchTimer(-3, null, mUnpluggables); 2920c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiRunningTimer = new StopwatchTimer(-4, null, mUnpluggables); 2921c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mBluetoothOnTimer = new StopwatchTimer(-5, null, mUnpluggables); 292218d200fd2aa26e4c9b6ca7c38bb5fd6b81e40259Mike Chan mAudioOnTimer = new StopwatchTimer(-6, null, mUnpluggables); 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = false; 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = 0; 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = 0; 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 2930633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = 0; 2931633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = 0; 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(Parcel p) { 29351afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile = null; 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcel(p); 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public void setNumSpeedSteps(int steps) { 2940e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (sNumSpeedSteps == 0) sNumSpeedSteps = steps; 2941e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 2942e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 2943f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void setRadioScanningTimeout(long timeout) { 2944f37447bad3773b62176baa837908daf6edb44273Amith Yamasani if (mPhoneSignalScanningTimer != null) { 2945f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.setTimeout(timeout); 2946f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 2947f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } 2948f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 295032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn public BatteryHistoryRecord getHistory() { 295132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn return mHistory; 295232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 295332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 295432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn @Override 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStartCount() { 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartCount; 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2963105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void setOnBattery(boolean onBattery, int level) { 29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 2965c64edde69d18498fb2954f71a546357b07ab996aEvan Millar updateKernelWakelocksLocked(); 29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBattery != onBattery) { 29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = onBattery; 29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long uptime = SystemClock.uptimeMillis() * 1000; 29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSecRealtime = SystemClock.elapsedRealtime(); 29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long realtime = mSecRealtime * 1000; 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (onBattery) { 297332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn clearHistory(); 297432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 297532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states &= ~BatteryHistoryRecord.STATE_BATTERY_PLUGGED_FLAG; 297632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: " 297732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 297832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(mSecRealtime); 29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = uptime; 29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = realtime; 29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime); 29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime); 2983633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = mDischargeStartLevel = level; 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doUnplug(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime); 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 298632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 298732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.states |= BatteryHistoryRecord.STATE_BATTERY_PLUGGED_FLAG; 298832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: " 298932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn + Integer.toHexString(mHistoryCur.states)); 299032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(mSecRealtime); 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; 2993633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = level; 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doPlug(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mLastWriteTime + (60 * 1000)) < mSecRealtime) { 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFile != null) { 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLocked(); 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3004633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 3005633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public void recordCurrentLevel(int level) { 300632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (mDischargeCurrentLevel != level) { 300732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mDischargeCurrentLevel = level; 300832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistoryCur.batteryLevel = (byte)level; 300932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(SystemClock.elapsedRealtime()); 301032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 3011633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 3012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3013c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateKernelWakelocksLocked() { 3014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = readKernelWakelockStats(); 3015c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3016d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen if (m == null) { 3017d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen // Not crashing might make board bringup easier. 30181afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "Couldn't get kernel wake lock stats"); 3019d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen return; 3020d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen } 3021d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen 3022c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) { 3023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name = ent.getKey(); 3024c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kws = ent.getValue(); 3025c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3026c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 3027c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 3028c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 3029c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 3030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 3031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3032c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedCount(kws.mCount); 3033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); 3034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.setUpdateVersion(sKernelWakelockUpdateVersion); 3035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3037c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != mKernelWakelockStats.size()) { 3038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Set timers to stale if they didn't appear in /proc/wakelocks this time. 3039c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 3040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer st = ent.getValue(); 3041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) { 3042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar st.setStale(); 3043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3046c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery(); 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeUptime(long curTime, int which) { 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: return mUptime + (curTime-mUptimeStart); 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastUptime; 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mUptimeStart); 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart); 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeRealtime(long curTime, int which) { 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart); 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastRealtime; 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mRealtimeStart); 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart); 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryUptime(long curTime, int which) { 30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryUptime + getBatteryUptime(curTime); 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastUptime; 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(curTime); 30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime; 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryRealtime(long curTime, int which) { 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryRealtime + getBatteryRealtimeLocked(curTime); 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastRealtime; 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime; 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked(long curTime) { 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastUptime; 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryUptimeStart; 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked() { 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(SystemClock.uptimeMillis() * 1000); 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryUptime(long curTime) { 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime); 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryRealtimeLocked(long curTime) { 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastRealtime; 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryRealtimeStart; 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryRealtime(long curTime) { 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 31383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani private long getTcpBytes(long current, long[] dataBytes, int which) { 31393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (which == STATS_LAST) { 31403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 31413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 31423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (which == STATS_UNPLUGGED) { 31433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani if (dataBytes[STATS_UNPLUGGED] < 0) { 31443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return dataBytes[STATS_LAST]; 31453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else { 31463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return current - dataBytes[STATS_UNPLUGGED]; 31473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 31483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } else if (which == STATS_TOTAL) { 31493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_TOTAL]; 31503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 31513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani return current - dataBytes[STATS_CURRENT]; 31523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 31533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 31543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 31553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 31563718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesSent(int which) { 31571719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getMobileTxBytes(), mMobileDataTx, which); 31583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 31593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 31603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 31613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getMobileTcpBytesReceived(int which) { 31621719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getMobileRxBytes(), mMobileDataRx, which); 31633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 31643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 31653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 31663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesSent(int which) { 31671719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getTotalTxBytes(), mTotalDataTx, which); 31683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 31693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 31703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani /** Only STATS_UNPLUGGED works properly */ 31713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani public long getTotalTcpBytesReceived(int which) { 31721719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff return getTcpBytes(TrafficStats.getTotalRxBytes(), mTotalDataRx, which); 31733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani } 31743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 3175105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 3176633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevel() { 3177105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 3178633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeStartLevelLocked(); 3179105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3180105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3181105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 3182633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevelLocked() { 3183633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return mDischargeStartLevel; 3184105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3185105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 3186105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 3187633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevel() { 3188105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 3189633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeCurrentLevelLocked(); 3190105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3191105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3192105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 3193633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevelLocked() { 3194633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return mDischargeCurrentLevel; 3195105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3197e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani @Override 3198e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public int getCpuSpeedSteps() { 3199e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return sNumSpeedSteps; 3200e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 3201e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular uid, creating if needed. 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid getUidStatsLocked(int uid) { 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.get(uid); 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u == null) { 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u = new Uid(uid); 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u; 32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the statistics object for a particular uid. 32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeUidStatsLocked(int uid) { 32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.remove(uid); 32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 322032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Proc getProcessStatsLocked(int uid, String name) { 32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getProcessStatsLocked(name); 32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 323132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * Retrieve the statistics object for a particular process, given 323232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * the name of the process. 323332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @param name process name 323432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani * @return the statistics object for the process 323532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani */ 3236819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani public Uid.Proc getProcessStatsLocked(String name, int pid) { 323732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani int uid; 323832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani if (mUidCache.containsKey(name)) { 323932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani uid = mUidCache.get(name); 324032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } else { 3241819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani uid = Process.getUidForPid(pid); 324232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mUidCache.put(name, uid); 324332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 324432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani Uid u = getUidStatsLocked(uid); 324532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani return u.getProcessStatsLocked(name); 324632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 324732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 324832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani /** 32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg getPackageStatsLocked(int uid, String pkg) { 32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getPackageStatsLocked(pkg); 32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) { 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getServiceStatsLocked(pkg, name); 32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32661afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn private static JournaledFile makeJournaledFile() { 32671afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn final String base = "/data/system/device_policies.xml"; 32681afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return new JournaledFile(new File(base), new File(base + ".tmp")); 32691afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 32701afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn 32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeLocked() { 32721afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 32731afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "writeLocked: no file associated with this instance"); 32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 32781afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite()); 32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeSummaryToParcel(out); 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.write(out.marshall()); 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.flush(); 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 32861afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile.commit(); 32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = SystemClock.elapsedRealtime(); 32898550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu return; 32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 32911afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "Error writing battery statistics", e); 32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32931afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn mFile.rollback(); 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static byte[] readFully(FileInputStream stream) throws java.io.IOException { 32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int avail = stream.available(); 32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[avail]; 33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int amt = stream.read(data, pos, data.length-pos); 33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "Read " + amt + " bytes at " + pos 33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " of avail " + data.length); 33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt <= 0) { 33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "**** FINISHED READING: pos=" + pos 33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " len=" + data.length); 33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos += amt; 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project avail = stream.available(); 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (avail > data.length-pos) { 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] newData = new byte[pos+avail]; 33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(data, 0, newData, 0, pos); 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = newData; 33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readLocked() { 33201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (mFile == null) { 33211afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readLocked: no file associated with this instance"); 33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 33281afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn File file = mFile.chooseForRead(); 33291afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (!file.exists()) { 33301afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn FileInputStream stream = new FileInputStream(file); 33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] raw = readFully(stream); 33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in = Parcel.obtain(); 33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.unmarshall(raw, 0, raw.length); 33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.setDataPosition(0); 33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSummaryFromParcel(in); 33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(java.io.IOException e) { 33421afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.e("BatteryStats", "Error reading battery statistics", e); 33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 335032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn void readHistory(Parcel in) { 335132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn mHistory = mHistoryEnd = mHistoryCache = null; 335232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn long time; 335332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn while ((time=in.readLong()) >= 0) { 335432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn BatteryHistoryRecord rec = new BatteryHistoryRecord(time, in); 335532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn addHistoryRecord(rec); 335632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 335732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 335832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 335932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn void writeHistory(Parcel out) { 336032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn BatteryHistoryRecord rec = mHistory; 336132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn while (rec != null) { 336232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn if (rec.time >= 0) rec.writeToParcel(out, 0); 336332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn rec = rec.next; 336432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 336532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn out.writeLong(-1); 336632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn } 336732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSummaryFromParcel(Parcel in) { 33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int version = in.readInt(); 33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (version != VERSION) { 33711afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w("BatteryStats", "readFromParcel: version got " + version 33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", expected " + VERSION + "; erasing old stats"); 33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 337632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn readHistory(in); 337732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastUptime = in.readLong(); 33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastRealtime = in.readLong(); 33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUptime = in.readLong(); 33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastRealtime = in.readLong(); 3387633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = in.readInt(); 3388633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 3389105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.readSummaryFromParcelLocked(in); 3394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); 3396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.readSummaryFromParcelLocked(in); 33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.readSummaryFromParcelLocked(in); 3400627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3401627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in); 3402627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3403f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in); 3404627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3405627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in); 3406627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3407105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 3408105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.readSummaryFromParcelLocked(in); 3409d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 3410d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.readSummaryFromParcelLocked(in); 3411105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 3412105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.readSummaryFromParcelLocked(in); 34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3414c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 34151afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NKW > 10000) { 34161afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW); 34171afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 34181afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 3419c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 3420c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 3421c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String kwltName = in.readString(); 3422c64edde69d18498fb2954f71a546357b07ab996aEvan Millar getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in); 3423c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3424c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3425e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3426e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 3427e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = in.readInt(); 34291afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NU > 10000) { 34301afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many uids " + NU); 34311afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 34321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3438617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOn = false; 3439617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in); 3440105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockOut = false; 3441105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); 3442244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mAudioTurnedOn = false; 3443244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in); 3444244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mVideoTurnedOn = false; 3445244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in); 3446105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockOut = false; 3447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); 34485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastEnabled = false; 34495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastTimer.readSummaryFromParcelLocked(in); 34505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 3451617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() != 0) { 3452617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 3453617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.initUserActivityLocked(); 3454617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3455617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 3456617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); 3457617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3458617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3459617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = in.readInt(); 34611afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NW > 10000) { 34621afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many wake locks " + NW); 34631afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 34641afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iw = 0; iw < NW; iw++) { 34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wlName = in.readString(); 34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in); 34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in); 34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in); 34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = in.readInt(); 34791afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NP > 10000) { 34801afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many sensors " + NP); 34811afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 34821afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NP; is++) { 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int seNumber = in.readInt(); 34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getSensorTimerLocked(seNumber, true) 34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .readSummaryFromParcelLocked(in); 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 34921afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NP > 10000) { 34931afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many processes " + NP); 34941afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 34951afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String procName = in.readString(); 34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc p = u.getProcessStatsLocked(procName); 34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mUserTime = p.mLoadedUserTime = in.readLong(); 35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastUserTime = in.readLong(); 35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mSystemTime = p.mLoadedSystemTime = in.readLong(); 35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastSystemTime = in.readLong(); 35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStarts = p.mLoadedStarts = in.readInt(); 35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastStarts = in.readInt(); 35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 35081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn if (NP > 10000) { 35091afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn Slog.w(TAG, "File corrupt: too many packages " + NP); 35101afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn return; 35111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn } 35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = in.readString(); 35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg p = u.getPackageStatsLocked(pkgName); 35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mWakeups = p.mLoadedWakeups = in.readInt(); 35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastWakeups = in.readInt(); 35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = in.readInt(); 35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NS; is++) { 35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String servName = in.readString(); 35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); 35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStartTime = s.mLoadedStartTime = in.readLong(); 35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastStartTime = in.readLong(); 35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStarts = s.mLoadedStarts = in.readInt(); 35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastStarts = in.readInt(); 35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLaunches = s.mLoadedLaunches = in.readInt(); 35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastLaunches = in.readInt(); 35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesReceived = in.readLong(); 35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesSent = in.readLong(); 35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a summary of the statistics to a Parcel, in a format suitable to be written to 35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disk. This format does not allow a lossless round-trip. 35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeSummaryToParcel(Parcel out) { 35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW_SYS = SystemClock.uptimeMillis() * 1000; 35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000; 35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW = getBatteryUptimeLocked(NOW_SYS); 35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS); 35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(VERSION); 35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 354932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn writeHistory(out); 355032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL)); 35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT)); 35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL)); 35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT)); 35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL)); 35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT)); 35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL)); 35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT)); 3560633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeStartLevel); 3561633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 3562105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3565617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3566617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 3567617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3568617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeSummaryFromParcelLocked(out); 35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3570627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3571627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 3572627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3573f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3574627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3575627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 3576627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3577105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3578d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3579105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3581c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 3582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 3583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer kwlt = ent.getValue(); 3584c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 3585c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 3586c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 3587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL); 3588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 3589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 3590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3593e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = mUidStats.size(); 35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NU); 35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(iu)); 35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 3599105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 3600617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3601105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3602c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3603c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3604105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 36055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL); 36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 3608617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 3609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 3610617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 3611617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 3612617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); 3613617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3614617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3615617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = u.mWakelockStats.size(); 36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NW); 36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent 36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mWakelockStats.entrySet()) { 36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerFull != null) { 36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL); 36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerPartial != null) { 36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL); 36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerWindow != null) { 36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL); 36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NSE = u.mSensorStats.size(); 36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NSE); 36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NSE > 0) { 36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent 36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mSensorStats.entrySet()) { 36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ent.getKey()); 36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se.mTimer != null) { 36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL); 36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = u.mProcessStats.size(); 36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent 36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mProcessStats.entrySet()) { 36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime); 36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime - ps.mLoadedUserTime); 36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime); 36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime); 36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts); 36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts - ps.mLoadedStarts); 36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = u.mPackageStats.size(); 36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent 36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mPackageStats.entrySet()) { 36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups); 36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups - ps.mLoadedWakeups); 36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = ps.mServiceStats.size(); 36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NS); 36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NS > 0) { 36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent 36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : ps.mServiceStats.entrySet()) { 36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(sent.getKey()); 36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue(); 36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = ss.getStartTimeToNowLocked(NOW); 36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time); 36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time - ss.mLoadedStartTime); 36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts); 36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts - ss.mLoadedStarts); 36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches); 36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches - ss.mLoadedLaunches); 36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(u.getTcpBytesReceived(STATS_TOTAL)); 37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(u.getTcpBytesSent(STATS_TOTAL)); 37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readFromParcel(Parcel in) { 37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcelLocked(in); 37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = in.readInt(); 37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != MAGIC) { 37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ParcelFormatException("Bad magic number"); 37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 371932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn readHistory(in); 372032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastUptime = in.readLong(); 37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastRealtime = in.readLong(); 37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 3727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables, in); 3728617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables, in); 3730617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3731617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables, in); 37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 3733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 3734627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables, in); 3736627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3737f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer = new StopwatchTimer(-200+1, null, mUnpluggables, in); 3738627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables, in); 3740627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3741105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 3742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 3743d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 3744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiRunningTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 3745105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 3746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mBluetoothOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = in.readLong(); 37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUptime = in.readLong(); 37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = in.readLong(); 37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastRealtime = in.readLong(); 37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = in.readInt() != 0; 37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBatteryInternal = false; // we are no longer really running. 37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = in.readLong(); 37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = in.readLong(); 37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = in.readLong(); 37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = in.readLong(); 37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = in.readLong(); 37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = in.readLong(); 3761633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = in.readInt(); 3762633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = in.readLong(); 37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataRx[STATS_LAST] = in.readLong(); 37663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataRx[STATS_UNPLUGGED] = -1; 37673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataTx[STATS_LAST] = in.readLong(); 37683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mMobileDataTx[STATS_UNPLUGGED] = -1; 37693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataRx[STATS_LAST] = in.readLong(); 37703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataRx[STATS_UNPLUGGED] = -1; 37713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataTx[STATS_LAST] = in.readLong(); 37723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mTotalDataTx[STATS_UNPLUGGED] = -1; 37733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 37743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataUptime = in.readLong(); 37753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani mRadioDataStart = -1; 37763718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 37773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingCount = in.readInt(); 37783f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani mBluetoothPingStart = -1; 37793f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 3780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.clear(); 3781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 3782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 3783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 3784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String wakelockName = in.readString(); 3785244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel 3786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); 3787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(wakelockName, kwlt); 3788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers.clear(); 37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers.clear(); 37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers.clear(); 37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3795e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani sNumSpeedSteps = in.readInt(); 3796e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numUids = in.readInt(); 37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numUids; i++) { 38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.readFromParcelLocked(mUnpluggables, in); 38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.append(uid, u); 38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeToParcelLocked(out, flags); 38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, int flags) { 38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecUptime = SystemClock.uptimeMillis() * 1000; 38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptimeLocked(uSecUptime); 38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(MAGIC); 381932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 382032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn writeHistory(out); 382132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn 38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryUptime); 38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryLastUptime); 38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryRealtime); 38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryLastRealtime); 38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeToParcel(out, batteryRealtime); 3828617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3829617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime); 3830617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3831617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeToParcel(out); 38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeToParcel(out, batteryRealtime); 3833627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3834627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime); 3835627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3836f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime); 3837627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3838627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime); 3839627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3840105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeToParcel(out, batteryRealtime); 3841d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.writeToParcel(out, batteryRealtime); 3842105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeToParcel(out, batteryRealtime); 38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptime); 38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptimeStart); 38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastUptime); 38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtime); 38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtimeStart); 38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastRealtime); 38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mOnBattery ? 1 : 0); 38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryUptime); 38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryUptimeStart); 38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryRealtime); 38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryRealtimeStart); 38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryUptime); 38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryRealtime); 3856633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeStartLevel); 3857633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastWriteTime); 38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani out.writeLong(getMobileTcpBytesReceived(STATS_UNPLUGGED)); 38613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani out.writeLong(getMobileTcpBytesSent(STATS_UNPLUGGED)); 38623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani out.writeLong(getTotalTcpBytesReceived(STATS_UNPLUGGED)); 38633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani out.writeLong(getTotalTcpBytesSent(STATS_UNPLUGGED)); 38643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 38653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani // Write radio uptime for data 38663f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeLong(getRadioDataUptime()); 38673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 38683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani out.writeInt(getBluetoothPingCount()); 38693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani 3870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 3871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 3872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = ent.getValue(); 3873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 3874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 3875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 3876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer.writeTimerToParcel(out, kwlt, batteryRealtime); 3877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 3878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 3879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3881e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 3882e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out.writeInt(sNumSpeedSteps); 3883e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = mUidStats.size(); 38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(size); 38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < size; i++) { 38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(i)); 38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid uid = mUidStats.valueAt(i); 38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid.writeToParcelLocked(out, batteryRealtime); 38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<BatteryStatsImpl> CREATOR = 38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<BatteryStatsImpl>() { 38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl createFromParcel(Parcel in) { 38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl(in); 38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl[] newArray(int size) { 39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl[size]; 39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void dumpLocked(PrintWriter pw) { 39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) { 39071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 39081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen timer:"); 39091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenOnTimer.logState(pr, " "); 3910617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 39111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen brightness #" + i + ":"); 39121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenBrightnessTimer[i].logState(pr, " "); 3913617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 39141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Input event counter:"); 39151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mInputEventCounter.logState(pr, " "); 39161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Phone timer:"); 39171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneOnTimer.logState(pr, " "); 3918627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 39191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Signal strength #" + i + ":"); 39201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneSignalStrengthsTimer[i].logState(pr, " "); 3921627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3922f37447bad3773b62176baa837908daf6edb44273Amith Yamasani pr.println("*** Signal scanning :"); 3923f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mPhoneSignalScanningTimer.logState(pr, " "); 3924627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 39251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Data connection type #" + i + ":"); 39261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneDataConnectionsTimer[i].logState(pr, " "); 39271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 39281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Wifi timer:"); 39291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiOnTimer.logState(pr, " "); 39301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** WifiRunning timer:"); 39311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiRunningTimer.logState(pr, " "); 39321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Bluetooth timer:"); 39331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mBluetoothOnTimer.logState(pr, " "); 39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dumpLocked(pw); 39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3938