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