BatteryStatsImpl.java revision 1fadab5c36445bb9f0997904dbce44f8e234f847
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;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
54c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator;
555a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganeshimport java.util.List;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
574cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger;
58ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackbornimport java.util.concurrent.locks.ReentrantLock;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
6832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    private static final boolean DEBUG_HISTORY = false;
695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
741fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    private static final int VERSION = 60;
75e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // Maximum number of items we will record in the history.
777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_HISTORY_ITEMS = 2000;
785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
79f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    // No, really, THIS is the maximum number of items we will record in the history.
80f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    private static final int MAX_MAX_HISTORY_ITEMS = 3000;
81f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
829e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // The maximum number of names wakelocks we will keep track of
839e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // per uid; once the limit is reached, we batch the remaining wakelocks
849e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // in to one common name.
857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_WAKELOCKS_PER_UID = 30;
865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
879e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    private static final String BATCHED_WAKELOCK_NAME = "*overflow*";
885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
89e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private static int sNumSpeedSteps;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
911afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    private final JournaledFile mFile;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_UPDATE_WAKELOCKS = 1;
940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_REPORT_POWER_CHANGE = 2;
95287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    static final long DELAY_UPDATE_WAKELOCKS = 5*1000;
960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public interface BatteryCallback {
980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryNeedsCpuUpdate();
990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryPowerChanged(boolean onBattery);
1000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
1010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final class MyHandler extends Handler {
1030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        @Override
1040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void handleMessage(Message msg) {
1050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            BatteryCallback cb = mCallback;
1060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            switch (msg.what) {
1070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_UPDATE_WAKELOCKS:
1080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryNeedsCpuUpdate();
1100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_REPORT_POWER_CHANGE:
1130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryPowerChanged(msg.arg1 != 0);
1150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
1180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
1190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
1200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private final MyHandler mHandler;
1220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private BatteryCallback mCallback;
1240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>();
136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>();
137c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>();
138c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers
139c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            = new SparseArray<ArrayList<StopwatchTimer>>();
14058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>();
14158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>();
14258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mScanWifiLockTimers = new ArrayList<StopwatchTimer>();
14358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    // Last partial timers we use for distributing CPU usage.
1460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>();
1470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
1515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mShuttingDown;
1535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    long mHistoryBaseTime;
1556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mHaveBatteryLevel = false;
1566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mRecordingHistory = true;
1576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mNumHistoryItems;
1580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1591fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    static final int MAX_HISTORY_BUFFER = 128*1024; // 128KB
1601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    static final int MAX_MAX_HISTORY_BUFFER = 144*1024; // 144KB
1610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final Parcel mHistoryBuffer = Parcel.obtain();
1620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryLastWritten = new HistoryItem();
1630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryLastLastWritten = new HistoryItem();
1641fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    final HistoryItem mHistoryReadTmp = new HistoryItem();
1650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    int mHistoryBufferLastPos = -1;
1660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    boolean mHistoryOverflow = false;
1670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    long mLastHistoryTime = 0;
1680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryCur = new HistoryItem();
1700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistory;
1726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryEnd;
1739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    HistoryItem mHistoryLastEnd;
1746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryCache;
1750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private HistoryItem mHistoryIterator;
1770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private boolean mReadOverflow;
1780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private boolean mIteratingHistory;
1795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
1935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
195c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mScreenOnTimer;
1963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
197617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mScreenBrightnessBin = -1;
198c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
1995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
200617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    Counter mInputEventCounter;
2015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mPhoneOnTimer;
2045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
205244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mAudioOn;
206244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mAudioOnTimer;
2075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
208244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mVideoOn;
209244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mVideoOnTimer;
2105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
211627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
212e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    int mPhoneSignalStrengthBinRaw = -1;
213c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneSignalStrengthsTimer =
2145284090631e638b916d9a453212e9dc802656a67Wink Saville            new StopwatchTimer[SignalStrength.NUM_SIGNAL_STRENGTH_BINS];
215f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
216f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    StopwatchTimer mPhoneSignalScanningTimer;
217f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
218627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
2195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    final StopwatchTimer[] mPhoneDataConnectionsTimer =
220c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
2215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
222105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
223c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiOnTimer;
224617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mWifiOnUid = -1;
225d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
22658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    boolean mGlobalWifiRunning;
22758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    StopwatchTimer mGlobalWifiRunningTimer;
2285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
229105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
230c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mBluetoothOnTimer;
2313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /** Bluetooth headset object */
2333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    BluetoothHeadset mBtHeadset;
2343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
2453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
2483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
249105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
252633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeStartLevel;
2536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mDischargeUnplugLevel;
254633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeCurrentLevel;
2553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mLowDischargeAmountSinceCharge;
2563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mHighDischargeAmountSinceCharge;
257c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeScreenOnUnplugLevel;
258c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeScreenOffUnplugLevel;
259c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOn;
260c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOnSinceCharge;
261c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOff;
262c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOffSinceCharge;
263244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
265244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    // Mobile data transferred while on battery
2673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataTx = new long[4];
2683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataRx = new long[4];
2693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataTx = new long[4];
2703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataRx = new long[4];
2713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataUptime;
2733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataStart;
2743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingCount;
2763f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingStart = -1;
2773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
278f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private int mPhoneServiceState = -1;
279e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int mPhoneServiceStateRaw = -1;
280e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int mPhoneSimStateRaw = -1;
281f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
282c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
283c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
284c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
2855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private final HashMap<String, SamplingTimer> mKernelWakelockStats =
286c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, SamplingTimer>();
2875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
288c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public Map<String, ? extends SamplingTimer> getKernelWakelockStats() {
289c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mKernelWakelockStats;
290c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
2915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
292c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static int sKernelWakelockUpdateVersion = 0;
2935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
294c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int[] PROC_WAKELOCKS_FORMAT = new int[] {
295c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
296c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 1: count
297c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
298c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
299c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
300c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 5: totalTime
301c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    };
3025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
303c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final String[] mProcWakelocksName = new String[3];
304c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final long[] mProcWakelocksData = new long[3];
3055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
306c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
307c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added
308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * to mKernelWakelockStats.
309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
3105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private final Map<String, KernelWakelockStats> mProcWakelockFileStats =
311c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, KernelWakelockStats>();
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>();
3145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
3171afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
3180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
327617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
328617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
329e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class Counter extends BatteryStats.Counter implements Unpluggable {
3304cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        final AtomicInteger mCount = new AtomicInteger();
3316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
332617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLoadedCount;
333617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLastCount;
334617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mUnpluggedCount;
335617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mPluggedCount;
3365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
337617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables, Parcel in) {
3386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
3394cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = in.readInt();
3404cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLoadedCount = in.readInt();
3423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
343617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = in.readInt();
344617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
345617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
346617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables) {
3486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
349617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void writeToParcel(Parcel out) {
3534cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(mCount.get());
354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLoadedCount);
355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mUnpluggedCount);
356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
358617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void unplug(long batteryUptime, long batteryRealtime) {
3594cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount;
3604cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
361617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
362617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void plug(long batteryUptime, long batteryRealtime) {
3644cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = mCount.get();
365617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
367617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Writes a possibly null Counter to a Parcel.
369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param out the Parcel to be written to.
371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param counter a Counter, or null.
372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
373617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static void writeCounterToParcel(Parcel out, Counter counter) {
374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (counter == null) {
375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0); // indicates null
376617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return;
377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(1); // indicates non-null
379617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
380617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            counter.writeToParcel(out);
381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
384c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
385617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            int val;
386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (which == STATS_LAST) {
387617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mLastCount;
388617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
3894cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate                val = mCount.get();
3906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
391617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mUnpluggedCount;
3926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
393617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mLoadedCount;
394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return val;
398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
399617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
400617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void logState(Printer pw, String prefix) {
4014cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            pw.println(prefix + "mCount=" + mCount.get()
402617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
403617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mUnpluggedCount=" + mUnpluggedCount
404617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mPluggedCount=" + mPluggedCount);
405617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4074cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        void stepAtomic() {
4084cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.incrementAndGet();
409617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
410617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
4116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
4126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this counter.
4136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
4146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void reset(boolean detachIfReset) {
4156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount.set(0);
4166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
4176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
4186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
4196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
4206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
4236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
4246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void writeSummaryFromParcelLocked(Parcel out) {
4274cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            int count = mCount.get();
4284cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(count);
429617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
430617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void readSummaryFromParcelLocked(Parcel in) {
4324cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mLoadedCount = in.readInt();
4334cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mLoadedCount);
4343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
4354cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount = mLoadedCount;
436617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
437617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
438e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
439e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class SamplingCounter extends Counter {
440e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
441e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) {
442e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables, in);
443e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
444e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
445e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables) {
446e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables);
447e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
448e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4494cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        public void addCountAtomic(long count) {
4504cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.addAndGet((int)count);
451e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
452e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
453e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
454617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static abstract class Timer extends BatteryStats.Timer implements Unpluggable {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
4596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
4605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
4655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
4685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
4755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
4815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
4875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
4945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
495244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        /**
496244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * Constructs from a parcel.
497244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param type
498244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param unpluggables
499244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param powerType
500244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param in
501244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         */
502c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) {
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
5046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
5055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
5083bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
5123bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
517c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables) {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
5196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract long computeRunTimeLocked(long curBatteryRealtime);
5245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract int computeCurrentCountLocked();
5265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
5286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this timer.  Returns true if the timer is inactive
5296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * so can be completely dropped.
5306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
5319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
5326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mTotalTime = mLoadedTime = mLastTime = 0;
5336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount = mLoadedCount = mLastCount = 0;
5346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
5356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
5366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
5386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
5416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
5426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
569c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " old mTotalTime=" + mTotalTime);
572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = computeRunTimeLocked(batteryRealtime);
574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = computeCurrentCountLocked();
575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType
577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + ": new mTotalTime=" + mTotalTime);
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long getTotalTimeLocked(long batteryRealtime, int which) {
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
6056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
6076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                val = computeCurrentCountLocked();
6226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
6246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
632627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + " mCount=" + mCount
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
636627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
638627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
6415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
6425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long runTime = computeRunTimeLocked(batteryRealtime);
645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Divide by 1000 for backwards compatibility
646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong((runTime + 500) / 1000);
647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount);
648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Multiply by 1000 for backwards compatibility
652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = mLoadedTime = in.readLong() * 1000;
6533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedTime = mTotalTime;
655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = mLoadedCount = in.readInt();
6563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedCount = mCount;
658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
6605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class SamplingTimer extends Timer {
6625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported count from /proc/wakelocks.
665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mCurrentReportedCount;
667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported count from /proc/wakelocks when unplug() was last
670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUnpluggedReportedCount;
673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported total_time from /proc/wakelocks.
6765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh         */
677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mCurrentReportedTotalTime;
678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported total_time from /proc/wakelocks when unplug() was last
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUnpluggedReportedTotalTime;
685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently in a discharge cycle.
688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mInDischarge;
690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently recording reported values.
693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mTrackingReportedValues;
6955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /*
697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * A sequnce counter, incremented once for each update of the stats.
698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUpdateVersion;
7005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) {
702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables, in);
703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = in.readInt();
704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = in.readInt();
705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = in.readLong();
706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = in.readLong();
707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
7115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge,
712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                boolean trackReportedValues) {
713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables);
714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = trackReportedValues;
715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setStale() {
719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = false;
720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = 0;
721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = 0;
722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
724c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setUpdateVersion(int version) {
725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateVersion = version;
726c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getUpdateVersion() {
729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUpdateVersion;
730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedCount(int count) {
733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedCount == 0) {
734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = count;
736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = count;
740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedTotalTime(long totalTime) {
743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedTotalTime == 0) {
744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = totalTime;
746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = totalTime;
750c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
752c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void unplug(long batteryUptime, long batteryRealtime) {
753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.unplug(batteryUptime, batteryRealtime);
754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mTrackingReportedValues) {
755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = mCurrentReportedCount;
757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = true;
759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
760c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.plug(batteryUptime, batteryRealtime);
763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = false;
764c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
7685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
769c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
770c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
7755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            return mTotalTime + (mInDischarge && mTrackingReportedValues
776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount + (mInDischarge && mTrackingReportedValues
781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mUnpluggedReportedCount);
788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUnpluggedReportedTotalTime);
790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
7939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
7949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, detachIfReset);
7956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            setStale();
7966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
7976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
7985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeSummaryFromParcelLocked(out, batteryRealtime);
801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
8135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /**
815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * State for keeping track of timing information.
816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class StopwatchTimer extends Timer {
8180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final Uid mUid;
819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        final ArrayList<StopwatchTimer> mTimerPool;
8200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mNesting;
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The last time at which we updated the timer.  If mNesting is > 0,
825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * subtract this from the current battery time to find the amount of
826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * time we have been running since we last computed an update.
827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUpdateTime;
8295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
8319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The total time at which the timer was acquired, to determine if it
832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * was actually held for an interesting duration.
833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mAcquireTime;
835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
836f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        long mTimeout;
837f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
8380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        /**
8390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * For partial wake locks, keep track of whether we are in the list
8400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * to consume CPU cycles.
8410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         */
8420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean mInList;
8430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
8440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables, Parcel in) {
846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables, in);
8470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateTime = in.readLong();
850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
8520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables) {
854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables);
8550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
859f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        void setTimeout(long timeout) {
860f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mTimeout = timeout;
861f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
862f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUpdateTime);
866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mNesting > 0) {
870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                super.plug(batteryUptime, batteryRealtime);
874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUpdateTime = batteryRealtime;
875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        boolean isRunningLocked() {
91032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            return mNesting > 0;
91132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
91232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                    final long realtime = SystemClock.elapsedRealtime() * 1000;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
950c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final ArrayList<StopwatchTimer> pool) {
9515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            final long realtime = SystemClock.elapsedRealtime() * 1000;
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
955c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final StopwatchTimer t = pool.get(i);
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
965c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
966f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) {
967f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                curBatteryRealtime = mUpdateTime + mTimeout;
968f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
975c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
976c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
977c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
9816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean canDetach = mNesting <= 0;
9829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, canDetach && detachIfReset);
9839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mNesting > 0) {
9849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mUpdateTime = stats.getBatteryRealtimeLocked(
9859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        SystemClock.elapsedRealtime() * 1000);
9869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
9879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mAcquireTime = mTotalTime;
9886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return canDetach;
9896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
9905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
9926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            super.detach();
9936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mTimerPool != null) {
9946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mTimerPool.remove(this);
9956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
9966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
9975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
999c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1004c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> readKernelWakelockStats() {
10055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
10063372f2e259247810627fd22033406163284f4f64Johannes Carlsson        byte[] buffer = new byte[8192];
1007c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int len;
10085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1009c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        try {
1010c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            FileInputStream is = new FileInputStream("/proc/wakelocks");
1011c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            len = is.read(buffer);
1012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            is.close();
1013c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (len > 0) {
1015c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                int i;
1016c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (i=0; i<len; i++) {
1017c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (buffer[i] == '\0') {
1018c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        len = i;
1019c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        break;
1020c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
1021c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1022c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.FileNotFoundException e) {
1024c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
1025c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.IOException e) {
1026c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
1027c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
10285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1029c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return parseProcWakelocks(buffer, len);
1030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
10315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1032c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> parseProcWakelocks(
1033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            byte[] wlBuffer, int len) {
1034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        String name;
1035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int count;
1036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long totalTime;
1037c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int startIndex, endIndex;
1038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int numUpdatedWlNames = 0;
1039c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        // Advance past the first line.
1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int i;
1042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++);
1043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        startIndex = endIndex = i + 1;
1044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        synchronized(this) {
1046c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Map<String, KernelWakelockStats> m = mProcWakelockFileStats;
10475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            sKernelWakelockUpdateVersion++;
1049c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            while (endIndex < len) {
10505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                for (endIndex=startIndex;
10515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                        endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0';
1052c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex++);
10533372f2e259247810627fd22033406163284f4f64Johannes Carlsson                endIndex++; // endIndex is an exclusive upper bound.
10543372f2e259247810627fd22033406163284f4f64Johannes Carlsson                // Don't go over the end of the buffer, Process.parseProcLine might
10553372f2e259247810627fd22033406163284f4f64Johannes Carlsson                // write to wlBuffer[endIndex]
10563372f2e259247810627fd22033406163284f4f64Johannes Carlsson                if (endIndex >= (len - 1) ) {
10573372f2e259247810627fd22033406163284f4f64Johannes Carlsson                    return m;
1058e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                }
1059c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String[] nameStringArray = mProcWakelocksName;
1061c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                long[] wlData = mProcWakelocksData;
10622098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // Stomp out any bad characters since this is from a circular buffer
10632098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // A corruption is seen sometimes that results in the vm crashing
10642098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // This should prevent crashes and the line will probably fail to parse
10652098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                for (int j = startIndex; j < endIndex; j++) {
10662098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                    if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?';
10672098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                }
106853b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex,
106953b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                        PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null);
10702098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani
1071c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                name = nameStringArray[0];
1072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                count = (int) wlData[1];
1073c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // convert nanoseconds to microseconds with rounding.
1074c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                totalTime = (wlData[2] + 500) / 1000;
1075c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
107653b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                if (parsed && name.length() > 0) {
1077c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (!m.containsKey(name)) {
10785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                        m.put(name, new KernelWakelockStats(count, totalTime,
1079c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                sKernelWakelockUpdateVersion));
1080c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        numUpdatedWlNames++;
1081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    } else {
1082c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        KernelWakelockStats kwlStats = m.get(name);
1083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        if (kwlStats.mVersion == sKernelWakelockUpdateVersion) {
1084c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount += count;
1085c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime += totalTime;
1086c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        } else {
1087c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount = count;
1088c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime = totalTime;
1089c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mVersion = sKernelWakelockUpdateVersion;
1090c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            numUpdatedWlNames++;
1091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        }
1092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
109353b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                }
1094c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                startIndex = endIndex;
1095c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (m.size() != numUpdatedWlNames) {
1098c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Don't report old data.
1099c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Iterator<KernelWakelockStats> itr = m.values().iterator();
1100c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                while (itr.hasNext()) {
1101c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (itr.next().mVersion != sKernelWakelockUpdateVersion) {
1102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        itr.remove();
1103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
1104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1106c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return m;
1107c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1108c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1110c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private class KernelWakelockStats {
1111c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mCount;
1112c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long mTotalTime;
1113c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mVersion;
11145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1115c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        KernelWakelockStats(int count, long totalTime, int version) {
1116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = count;
1117c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = totalTime;
1118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mVersion = version;
1119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1122c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
11235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh     * Get the KernelWakelockTimer associated with name, and create a new one if one
1124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * doesn't already exist.
1125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
1126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public SamplingTimer getKernelWakelockTimerLocked(String name) {
1127c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer kwlt = mKernelWakelockStats.get(name);
1128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kwlt == null) {
11295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
1130c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    true /* track reported values */);
1131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mKernelWakelockStats.put(name, kwlt);
1132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return kwlt;
1134c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataPlug(long[] dataTransfer, long currentBytes) {
11376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_LAST] = dataTransfer[STATS_SINCE_UNPLUGGED];
11386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = -1;
11393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataUnplug(long[] dataTransfer, long currentBytes) {
11426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = currentBytes;
11433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Radio uptime in microseconds when transferring data. This value is very approximate.
11473f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return
11483f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private long getCurrentRadioDataUptime() {
11503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        try {
11513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
11523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (!awakeTimeFile.exists()) return 0;
11533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
11543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            String line = br.readLine();
11553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            br.close();
11563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return Long.parseLong(line) * 1000;
11573718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (NumberFormatException nfe) {
11583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
11593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (IOException ioe) {
11603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
11613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
11623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return 0;
11633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11653f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11663f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
11673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getRadioDataUptimeMs() {
11693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
11703f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
11713f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
11723f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh     * Returns the duration that the cell radio was up for data transfers.
11743f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptime() {
11763718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (mRadioDataStart == -1) {
11773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return mRadioDataUptime;
11783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
11793f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentRadioDataUptime() - mRadioDataStart;
11803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
11813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int getCurrentBluetoothPingCount() {
11843f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBtHeadset != null) {
11855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            List<BluetoothDevice> deviceList = mBtHeadset.getConnectedDevices();
11865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            if (deviceList.size() > 0) {
11875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                return mBtHeadset.getBatteryUsageHint(deviceList.get(0));
11883f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            }
11893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
11903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return -1;
11913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
11923f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
11933f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public int getBluetoothPingCount() {
11943f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBluetoothPingStart == -1) {
11953f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBluetoothPingCount;
11963f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        } else if (mBtHeadset != null) {
11973f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentBluetoothPingCount() - mBluetoothPingStart;
11983f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
119982cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        return 0;
12003f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public void setBtHeadset(BluetoothHeadset headset) {
120382cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) {
120482cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani            mBluetoothPingStart = getCurrentBluetoothPingCount();
120582cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        }
12063f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBtHeadset = headset;
12073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    int mChangedBufferStates = 0;
12100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void addHistoryBufferLocked(long curTime) {
12120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!mHaveBatteryLevel || !mRecordingHistory) {
12130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12161fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        final long timeDiff = (mHistoryBaseTime+curTime) - mHistoryLastWritten.time;
12170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mHistoryBufferLastPos >= 0 && mHistoryLastWritten.cmd == HistoryItem.CMD_UPDATE
12181fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                && timeDiff < 2000
12190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                && ((mHistoryLastWritten.states^mHistoryCur.states)&mChangedBufferStates) == 0) {
12200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // If the current is the same as the one before, then we no
12210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // longer need the entry.
12220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataSize(mHistoryBufferLastPos);
12230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(mHistoryBufferLastPos);
12240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBufferLastPos = -1;
12250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (mHistoryLastLastWritten.cmd == HistoryItem.CMD_UPDATE
12261fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    && timeDiff < 500 && mHistoryLastLastWritten.same(mHistoryCur)) {
12270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // If this results in us returning to the state written
12280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // prior to the last one, then we can just delete the last
12290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // written one and drop the new one.  Nothing more to do.
12300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryLastWritten.setTo(mHistoryLastLastWritten);
12310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL;
12320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                return;
12330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mChangedBufferStates |= mHistoryLastWritten.states^mHistoryCur.states;
12350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            curTime = mHistoryLastWritten.time - mHistoryBaseTime;
12361fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mHistoryLastWritten.setTo(mHistoryLastLastWritten);
12370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else {
12380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mChangedBufferStates = 0;
12390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        final int dataSize = mHistoryBuffer.dataSize();
12420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (dataSize >= MAX_HISTORY_BUFFER) {
12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (!mHistoryOverflow) {
12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryOverflow = true;
12450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                addHistoryBufferLocked(curTime, HistoryItem.CMD_OVERFLOW);
12460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // Once we've reached the maximum number of items, we only
12490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // record changes to the battery level and the most interesting states.
12500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // Once we've reached the maximum maximum number of items, we only
12510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // record changes to the battery level.
12520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (mHistoryLastWritten.batteryLevel == mHistoryCur.batteryLevel &&
12530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    (dataSize >= MAX_MAX_HISTORY_BUFFER
12540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            || ((mHistoryEnd.states^mHistoryCur.states)
12550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                                    & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
12560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                return;
12570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(curTime, HistoryItem.CMD_UPDATE);
12610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
12620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void addHistoryBufferLocked(long curTime, byte cmd) {
12640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int origPos = 0;
12650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mIteratingHistory) {
12660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            origPos = mHistoryBuffer.dataPosition();
12670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
12680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBufferLastPos = mHistoryBuffer.dataPosition();
12700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastLastWritten.setTo(mHistoryLastWritten);
12710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur);
12720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.writeDelta(mHistoryBuffer, mHistoryLastLastWritten);
12730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mLastHistoryTime = curTime;
12740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "Writing history buffer: was " + mHistoryBufferLastPos
12750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " now " + mHistoryBuffer.dataPosition()
12760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " size is now " + mHistoryBuffer.dataSize());
12770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mIteratingHistory) {
12780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(origPos);
12790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
12810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1282f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    int mChangedStates = 0;
1283f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
12846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime) {
12850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(curTime);
12860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (!mHaveBatteryLevel || !mRecordingHistory) {
12886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
12896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
12909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
12919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        // If the current time is basically the same as the last time,
1292f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // and no states have since the last recorded entry changed and
1293f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // are now resetting back to their original value, then just collapse
1294f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // into one record.
12959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE
1296f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+2000)
1297f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && ((mHistoryEnd.states^mHistoryCur.states)&mChangedStates) == 0) {
12989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // If the current is the same as the one before, then we no
12999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // longer need the entry.
13009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE
13011fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+500)
13029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && mHistoryLastEnd.same(mHistoryCur)) {
13039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd.next = null;
13049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.next = mHistoryCache;
13059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryCache = mHistoryEnd;
13069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd = mHistoryLastEnd;
13079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd = null;
13089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            } else {
1309f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                mChangedStates |= mHistoryEnd.states^mHistoryCur.states;
13109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, mHistoryCur);
13119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
13129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return;
13139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
13149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1315f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        mChangedStates = 0;
1316f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
1317f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        if (mNumHistoryItems == MAX_HISTORY_ITEMS
1318f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) {
13197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            addHistoryRecordLocked(curTime, HistoryItem.CMD_OVERFLOW);
13207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
13217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
13226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mNumHistoryItems >= MAX_HISTORY_ITEMS) {
13236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // Once we've reached the maximum number of items, we only
1324f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // record changes to the battery level and the most interesting states.
1325f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // Once we've reached the maximum maximum number of items, we only
13266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // record changes to the battery level.
13276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryEnd != null && mHistoryEnd.batteryLevel
1328f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    == mHistoryCur.batteryLevel &&
1329f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS
1330f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                            || ((mHistoryEnd.states^mHistoryCur.states)
1331f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                                    & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
13326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return;
13336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
13346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
13359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE);
13376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
13385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime, byte cmd) {
13406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistoryCache;
134132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (rec != null) {
134232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCache = rec.next;
134332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
13446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            rec = new HistoryItem();
134532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
13466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur);
13475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(rec);
134932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
13505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(HistoryItem rec) {
13526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mNumHistoryItems++;
135332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        rec.next = null;
13549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mHistoryLastEnd = mHistoryEnd;
135532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mHistoryEnd != null) {
135632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd.next = rec;
135732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd = rec;
135832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
135932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistory = mHistoryEnd = rec;
136032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
136132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
13625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void clearHistoryLocked() {
13640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "********** CLEARING HISTORY!");
136532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mHistory != null) {
136632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd.next = mHistoryCache;
136732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCache = mHistory;
13689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistory = mHistoryLastEnd = mHistoryEnd = null;
136932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
13706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mNumHistoryItems = 0;
13716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mHistoryBaseTime = 0;
13720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mLastHistoryTime = 0;
13730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
13740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataSize(0);
13750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
13760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER/2);
13770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL;
13780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.cmd = HistoryItem.CMD_NULL;
13790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBufferLastPos = -1;
13800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryOverflow = false;
138132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
13825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doUnplugLocked(long batteryUptime, long batteryRealtime) {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
13861719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff            u.mStartedTcpBytesReceived = TrafficStats.getUidRxBytes(u.mUid);
13871719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff            u.mStartedTcpBytesSent = TrafficStats.getUidTxBytes(u.mUid);
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track total mobile data
13951719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mMobileDataRx, TrafficStats.getMobileRxBytes());
13961719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mMobileDataTx, TrafficStats.getMobileTxBytes());
13971719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mTotalDataRx, TrafficStats.getTotalRxBytes());
13981719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mTotalDataTx, TrafficStats.getTotalTxBytes());
13993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
14003f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataStart = getCurrentRadioDataUptime();
14013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = 0;
14023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
14033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = getCurrentBluetoothPingCount();
14043f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = 0;
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
14076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doPlugLocked(long batteryUptime, long batteryRealtime) {
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14221719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mMobileDataRx, TrafficStats.getMobileRxBytes());
14231719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mMobileDataTx, TrafficStats.getMobileTxBytes());
14241719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mTotalDataRx, TrafficStats.getTotalRxBytes());
14251719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mTotalDataTx, TrafficStats.getTotalTxBytes());
14263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
14273f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataUptime = getRadioDataUptime();
14283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
14293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
14303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
14313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = getBluetoothPingCount();
14323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
14359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mWakeLockNesting;
14369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
14379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartWakeLocked(int uid, int pid, String name, int type) {
14381ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
14391ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // Only care about partial wake locks, since full wake locks
14401ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // will be canceled when the user puts the screen to sleep.
14411ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
14421ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG;
14431ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: "
14441ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
14451ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
14461ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
14471ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting++;
14489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
14499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
14500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
14510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
14520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
14530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
14549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type);
14559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
14569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
14579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
14589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopWakeLocked(int uid, int pid, String name, int type) {
14591ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
14601ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting--;
14611ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
14621ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG;
14631ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: "
14641ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
14651ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
14661ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
14679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
14689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
14690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
14700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
14710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
14720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
14739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type);
14749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
14759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
14769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
14777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
14787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
14797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
14807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStartWakeLocked(ws.get(i), pid, name, type);
14817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
14827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
14837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
14847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
14857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
14867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
14877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStopWakeLocked(ws.get(i), pid, name, type);
14887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
14897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
14907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
14910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public int startAddingCpuLocked() {
14920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler.removeMessages(MSG_UPDATE_WAKELOCKS);
14930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
14940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (mScreenOn) {
14950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
14960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
14970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
14980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
14990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (N == 0) {
15000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.clear();
15010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
15020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // How many timers should consume CPU?  Only want to include ones
15050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // that have already been in the list.
15060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
15070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
15080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (st.mInList) {
15090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = st.mUid;
15100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // We don't include the system UID, because it so often
15110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // holds wake locks at one request or another of an app.
15120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null && uid.mUid != Process.SYSTEM_UID) {
15130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    return 50;
15140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
15150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        return 0;
15190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
15200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void finishAddingCpuLocked(int perc, int utime, int stime, long[] cpuSpeedTimes) {
15220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
15230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (perc != 0) {
15240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            int num = 0;
15250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<N; i++) {
15260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                StopwatchTimer st = mPartialTimers.get(i);
15270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (st.mInList) {
15280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid uid = st.mUid;
15290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // We don't include the system UID, because it so often
15300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // holds wake locks at one request or another of an app.
15310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (uid != null && uid.mUid != Process.SYSTEM_UID) {
15320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        num++;
15330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
15340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
15350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (num != 0) {
15370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                for (int i=0; i<N; i++) {
15380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    StopwatchTimer st = mPartialTimers.get(i);
15390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (st.mInList) {
15400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        Uid uid = st.mUid;
15410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        if (uid != null && uid.mUid != Process.SYSTEM_UID) {
1542618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int myUTime = utime/num;
1543618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int mySTime = stime/num;
1544618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            utime -= myUTime;
1545618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            stime -= mySTime;
1546618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            num--;
15470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*");
15480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addCpuTimeLocked(myUTime, mySTime);
15490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addSpeedStepTimes(cpuSpeedTimes);
15500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        }
15510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
15520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
15530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            // Just in case, collect any lost CPU time.
15560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (utime != 0 || stime != 0) {
15570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = getUidStatsLocked(Process.SYSTEM_UID);
15580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null) {
15590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid.Proc proc = uid.getProcessStatsLocked("*lost*");
15600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addCpuTimeLocked(utime, stime);
15610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addSpeedStepTimes(cpuSpeedTimes);
15620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
15630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int NL = mLastPartialTimers.size();
15670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean diff = N != NL;
15680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL && !diff; i++) {
15690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i);
15700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (!diff) {
15720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<NL; i++) {
15730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mPartialTimers.get(i).mInList = true;
15740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return;
15760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL; i++) {
15790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.get(i).mInList = false;
15800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mLastPartialTimers.clear();
15820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
15830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
15840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            st.mInList = true;
15850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.add(st);
15860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
15880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteProcessDiedLocked(int uid, int pid) {
15909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
15919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
15929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.mPids.remove(pid);
15939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
15959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public long getProcessWakeTime(int uid, int pid, long realtime) {
15979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
15989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
15999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Uid.Pid p = u.mPids.get(pid);
16009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
16019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return p.mWakeSum + (p.mWakeStart != 0 ? (realtime - p.mWakeStart) : 0);
16029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
16039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return 0;
16059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) {
16089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.reportExcessiveWakeLocked(proc, overTime, usedTime);
16119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1614287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) {
1615287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        Uid u = mUidStats.get(uid);
1616287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        if (u != null) {
1617287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            u.reportExcessiveCpuLocked(proc, overTime, usedTime);
1618287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
1619287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    }
1620287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
16219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mSensorNesting;
16229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartSensorLocked(int uid, int sensor) {
16249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
16259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG;
16269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: "
16279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting++;
16319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStartSensor(sensor);
16329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopSensorLocked(int uid, int sensor) {
16359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting--;
16369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
16379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG;
16389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: "
16399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStopSensor(sensor);
16439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
164532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mGpsNesting;
16465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
16476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStartGpsLocked(int uid) {
164832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
16496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG;
165032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: "
165132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
165332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
165432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting++;
16552e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStartGps();
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16575a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
16586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStopGpsLocked(int uid) {
165932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting--;
166032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
16616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG;
166232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: "
166332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
166532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
16662e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStopGps();
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
16716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG;
167232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: "
167332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
1677617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1678617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this);
1679617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
16809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // Fake a wake lock, so we consider the device waked as long
16829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // as the screen is on.
16831ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1684c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
1685c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            // Update discharge amounts.
1686c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBatteryInternal) {
168732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                updateDischargeScreenLevelsLocked(false, true);
1688c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
16946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG;
169532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: "
169632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
1700617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1701617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1702617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
17039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
17041ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1705c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
1706c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            // Update discharge amounts.
1707c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBatteryInternal) {
170832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                updateDischargeScreenLevelsLocked(true, false);
1709c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
1710617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1711617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1713617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightnessLocked(int brightness) {
1714617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Bin the brightness.
1715617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
1716617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (bin < 0) bin = 0;
1717617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
1718617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mScreenBrightnessBin != bin) {
17196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK)
17206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT);
172132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: "
172232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1724617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenOn) {
1725617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (mScreenBrightnessBin >= 0) {
1726617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1727617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1728617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[bin].startRunningLocked(this);
1729617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1730617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessBin = bin;
1731617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1732617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17344cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate    public void noteInputEventAtomic() {
17354cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        mInputEventCounter.stepAtomic();
1736617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1738617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivityLocked(int uid, int event) {
17392e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteUserActivityLocked(event);
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
17443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG;
174532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: "
174632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
17553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG;
175632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: "
175732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
176332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
17643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void stopAllSignalStrengthTimersLocked(int except) {
17655284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
17663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (i == except) {
17673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                continue;
17683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
17693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) {
17703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalStrengthsTimer[i].stopRunningLocked(this);
17713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
17723bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
17733bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
17743bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1775e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int fixPhoneServiceState(int state, int signalBin) {
1776e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (mPhoneSimStateRaw == TelephonyManager.SIM_STATE_ABSENT) {
1777e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // In this case we will always be STATE_OUT_OF_SERVICE, so need
1778e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // to infer that we are scanning from other data.
1779e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (state == ServiceState.STATE_OUT_OF_SERVICE
17805284090631e638b916d9a453212e9dc802656a67Wink Saville                    && signalBin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
1781e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                state = ServiceState.STATE_IN_SERVICE;
1782e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1783e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1784e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1785e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return state;
1786e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
1787e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1788e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private void updateAllPhoneStateLocked(int state, int simState, int bin) {
17893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        boolean scanning = false;
1790e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        boolean newHistory = false;
17913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1792e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneServiceStateRaw = state;
1793e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneSimStateRaw = simState;
1794e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneSignalStrengthBinRaw = bin;
1795e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1796e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (simState == TelephonyManager.SIM_STATE_ABSENT) {
1797e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // In this case we will always be STATE_OUT_OF_SERVICE, so need
1798e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // to infer that we are scanning from other data.
1799e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (state == ServiceState.STATE_OUT_OF_SERVICE
18005284090631e638b916d9a453212e9dc802656a67Wink Saville                    && bin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
1801e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                state = ServiceState.STATE_IN_SERVICE;
1802e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1803e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
18043bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
18053bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If the phone is powered off, stop all timers.
18063bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (state == ServiceState.STATE_POWER_OFF) {
1807e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            bin = -1;
1808f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1809e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        // If we are in service, make sure the correct signal string timer is running.
1810e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else if (state == ServiceState.STATE_IN_SERVICE) {
1811e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // Bin will be changed below.
18123bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
18133bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If we're out of service, we are in the lowest signal strength
18143bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // bin and have the scanning bit set.
1815f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        } else if (state == ServiceState.STATE_OUT_OF_SERVICE) {
18163bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            scanning = true;
18175284090631e638b916d9a453212e9dc802656a67Wink Saville            bin = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1818f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalScanningTimer.isRunningLocked()) {
18196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG;
1820e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
18216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: "
18226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1823f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalScanningTimer.startRunningLocked(this);
1824f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1825f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
18265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
18273bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (!scanning) {
18283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            // If we are no longer scanning, then stop the scanning timer.
18293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (mPhoneSignalScanningTimer.isRunningLocked()) {
18303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG;
18313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: "
18323bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1833e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
18343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalScanningTimer.stopRunningLocked(this);
18353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
18363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
18373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
183832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mPhoneServiceState != state) {
18396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK)
18406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (state << HistoryItem.STATE_PHONE_STATE_SHIFT);
1841e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + state + " to: "
184232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
1843e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            newHistory = true;
184432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mPhoneServiceState = state;
184532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
1846e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1847e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
1848e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
1849e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
1850e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1851e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (bin >= 0) {
1852e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) {
1853e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1854e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                }
1855e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_SIGNAL_STRENGTH_MASK)
1856e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        | (bin << HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT);
1857e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: "
1858e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1859e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
1860e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            } else {
1861e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                stopAllSignalStrengthTimersLocked(-1);
1862e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1863e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mPhoneSignalStrengthBin = bin;
1864e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1865e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1866e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (newHistory) {
1867e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1868e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1869e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
1870e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1871e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    /**
1872e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * Telephony stack updates the phone state.
1873e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * @param state phone state from ServiceState.getState()
1874e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     */
1875e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    public void notePhoneStateLocked(int state, int simState) {
1876e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        updateAllPhoneStateLocked(state, simState, mPhoneSignalStrengthBinRaw);
187732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
187832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1879e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
1880627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
18815284090631e638b916d9a453212e9dc802656a67Wink Saville        int bin = signalStrength.getLevel();
1882e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        updateAllPhoneStateLocked(mPhoneServiceStateRaw, mPhoneSimStateRaw, bin);
1883627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
18845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1885627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
1886627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
1887627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
1888627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
1889627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
1890627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
1891627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1892627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
1893627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
1894627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1895627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
1896627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
1897627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
18986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_CDMA:
18996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_CDMA;
19006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_0:
19026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_0;
19036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_A:
19056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_A;
19066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_1xRTT:
19086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_1xRTT;
19096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSDPA:
19116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSDPA;
19126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSUPA:
19146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSUPA;
19156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSPA:
19176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSPA;
19186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_IDEN:
19206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_IDEN;
19216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_B:
19236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_B;
19246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
1925962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                case TelephonyManager.NETWORK_TYPE_LTE:
1926962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    bin = DATA_CONNECTION_LTE;
1927962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    break;
1928962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                case TelephonyManager.NETWORK_TYPE_EHRPD:
1929962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    bin = DATA_CONNECTION_EHRPD;
1930962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    break;
1931627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
1932627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
1933627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1934627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1935627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
19363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData);
1937627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
19386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK)
19396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT);
194032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: "
194132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1943627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
1944627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
1945627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1946627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
1947627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
1948627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1949627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
19505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
195158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOnLocked() {
1952105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
19536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG;
195432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: "
195532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1957105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
1958105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
1959105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1960105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
19615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
196258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOffLocked() {
1963105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
19646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG;
196532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: "
196632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1968105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
1969105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
1970105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1971617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid >= 0) {
197258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked();
1973617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = -1;
1974617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1975105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1976244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1977244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOnLocked(int uid) {
1978244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mAudioOn) {
19796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG;
198032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: "
198132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1983244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = true;
1984244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.startRunningLocked(this);
1985244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
19862e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOnLocked();
1987244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
19885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1989244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOffLocked(int uid) {
1990244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mAudioOn) {
19916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG;
199232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: "
199332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1995244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = false;
1996244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.stopRunningLocked(this);
1997244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
19982e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOffLocked();
1999244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
2000244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2001244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOnLocked(int uid) {
2002244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mVideoOn) {
20036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG;
200432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: "
200532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2007244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = true;
2008244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.startRunningLocked(this);
2009244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20102e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOnLocked();
2011244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
20125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2013244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOffLocked(int uid) {
2014244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mVideoOn) {
20156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG;
201632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: "
201732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2019244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = false;
2020244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.stopRunningLocked(this);
2021244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20222e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOffLocked();
2023244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
2024244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
202558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningLocked(WorkSource ws) {
202658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (!mGlobalWifiRunning) {
20276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG;
202832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: "
202932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
203158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = true;
203258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.startRunningLocked(this);
203358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
203458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
203558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiRunningLocked();
203658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
203758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
203858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running");
2039d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
2040d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2041d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
204258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) {
204358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
204458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = oldWs.size();
204558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
204658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked();
204758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
204858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            N = newWs.size();
204958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
205058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked();
205158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
205258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
205358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running");
205458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
205558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
205658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
205758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStoppedLocked(WorkSource ws) {
205858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
20596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RUNNING_FLAG;
206032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: "
206132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
206358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = false;
206458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.stopRunningLocked(this);
206558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
206658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
206758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked();
206858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
206958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
207058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running");
2071d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
2072d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2073d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2074105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
2075105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
20766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG;
207732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: "
207832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2080105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
2081105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
2082105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2083105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
20845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2085105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
2086105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
20876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG;
208832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: "
208932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2091105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
2092105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
2093105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2094105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
20955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
209632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiFullLockNesting = 0;
20975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2098105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
209932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
21006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
210132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: "
210232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
210432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
210532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting++;
21062e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked();
2107105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2109105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
211032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting--;
211132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
21126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
211332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: "
211432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
211632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
21172e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockReleasedLocked();
2118105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2119105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
212032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiScanLockNesting = 0;
21215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2122105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
212332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
21246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
212532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: "
212632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
212832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
212932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting++;
21302e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked();
2131105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2132105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2133105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
213432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting--;
213532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
21366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
213732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: "
213832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
214032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
21412e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockReleasedLocked();
2142105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
21435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
214432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiMulticastNesting = 0;
21455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
21465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabledLocked(int uid) {
214732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
21486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
214932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: "
215032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
215232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
215332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting++;
21542e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastEnabledLocked();
21555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
21565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
21575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabledLocked(int uid) {
215832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting--;
215932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
21606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
216132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: "
216232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
216432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
21652e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastDisabledLocked();
21665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
21675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
21687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) {
21697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
21707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
21717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockAcquiredLocked(ws.get(i));
21727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
21737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
21747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
21757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) {
21767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
21777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
21787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockReleasedLocked(ws.get(i));
21797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
21807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
21817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
21827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteScanWifiLockAcquiredFromSourceLocked(WorkSource ws) {
21837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
21847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
21857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteScanWifiLockAcquiredLocked(ws.get(i));
21867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
21877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
21887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
21897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteScanWifiLockReleasedFromSourceLocked(WorkSource ws) {
21907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
21917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
21927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteScanWifiLockReleasedLocked(ws.get(i));
21937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
21947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
21957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
21967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) {
21977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
21987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
21997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastEnabledLocked(ws.get(i));
22007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) {
22047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastDisabledLocked(ws.get(i));
22077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
2211c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which);
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2214617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public long getScreenBrightnessTime(int brightnessBin,
2215617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which) {
2216c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
2217617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                batteryRealtime, which);
2218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
2219244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getInputEventCount(int which) {
2221c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mInputEventCounter.getCountLocked(which);
2222617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
22235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
2225c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which);
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2227244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2228627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
2229627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2230c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
2231627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2232627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
2233f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2234f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    @Override public long getPhoneSignalScanningTime(
2235f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            long batteryRealtime, int which) {
2236f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        return mPhoneSignalScanningTimer.getTotalTimeLocked(
2237f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                batteryRealtime, which);
2238f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
2239f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2240617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneSignalStrengthCount(int dataType, int which) {
2241c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2242617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
22435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2244627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
2245627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2246c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
2247627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2248627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
22495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2250617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneDataConnectionCount(int dataType, int which) {
2251c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
22535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2254105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
2255c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which);
2256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
22575a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
225858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) {
225958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2260d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2261d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
2263c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which);
2264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
22655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
22785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
22865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
22915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
229258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        boolean mWifiRunning;
229358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        StopwatchTimer mWifiRunningTimer;
22945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2295105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
2296c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mFullWifiLockTimer;
22975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2298105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
2299c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mScanWifiLockTimer;
23005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        boolean mWifiMulticastEnabled;
23025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        StopwatchTimer mWifiMulticastTimer;
23035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2304244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mAudioTurnedOn;
2305244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mAudioTurnedOnTimer;
23065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2307244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mVideoTurnedOn;
2308244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mVideoTurnedOnTimer;
23095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
2310617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter[] mUserActivityCounters;
23115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
23315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        /**
23339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The transient wake stats we have collected for this uid's pids.
23349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         */
23359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        final SparseArray<Pid> mPids = new SparseArray<Pid>();
23369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
233958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
234058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimers, mUnpluggables);
23410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
234258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mFullWifiLockTimers, mUnpluggables);
23430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
234458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mScanWifiLockTimers, mUnpluggables);
23450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
234658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiMulticastTimers, mUnpluggables);
23470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
23480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables);
23490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
23505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables);
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2372eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2373eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2377eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2378eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
23846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
23866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
23951719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff                    ? (TrafficStats.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2397eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2398eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
24046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
24066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2413105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
241458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiRunningLocked() {
241558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (!mWifiRunning) {
241658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = true;
241758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer == null) {
241858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
241958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiRunningTimers, mUnpluggables);
24206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
242158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this);
2422617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
24245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2425617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
242658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiStoppedLocked() {
242758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunning) {
242858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = false;
242958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this);
2430617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
24325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2434105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
2435105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
2436105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
24376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer == null) {
24380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
243958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mFullWifiLockTimers, mUnpluggables);
24406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
2441105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
2442105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
24445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2445105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2446105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
2447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
2448105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
2449105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
2450105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2451105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
24525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2453105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2454105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
2455105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
2456105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
24576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mScanWifiLockTimer == null) {
24580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
245958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mScanWifiLockTimers, mUnpluggables);
24606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
2461105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
2462105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2463105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
24645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2465105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2466105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
2467105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
2468105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
2469105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
2470105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2471105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
24725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
24735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
24745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastEnabledLocked() {
24755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (!mWifiMulticastEnabled) {
24765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = true;
24776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer == null) {
24780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
247958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiMulticastTimers, mUnpluggables);
24806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
24815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this);
24825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
24835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
24845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
24855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
24865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastDisabledLocked() {
24875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (mWifiMulticastEnabled) {
24885347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = false;
24895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this);
24905347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
24915347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
24925347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
24936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
24946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOnLocked() {
24956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mAudioTurnedOn) {
24966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = true;
24976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer == null) {
24980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
24996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
25006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
25026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2503617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2504244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
25056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOffLocked() {
25076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOn) {
25086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = false;
25096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
25106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
25126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOnLocked() {
25156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mVideoTurnedOn) {
25166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = true;
25176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer == null) {
25180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
25196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
25206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
25226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
25246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOffLocked() {
25276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOn) {
25286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = false;
25296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
25306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2531244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2532244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
25335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
253458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public long getWifiRunningTime(long batteryRealtime, int which) {
253558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer == null) {
25366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
25376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
253858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2539244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2540244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
25415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
2542105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
25436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer == null) {
25446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
25456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
2547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
25495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
2550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
25516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer == null) {
25526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
25536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
2555105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
25585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public long getWifiMulticastTime(long batteryRealtime, int which) {
25596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer == null) {
25606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
25616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime,
25635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                          which);
25645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
25655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
25676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getAudioTurnedOnTime(long batteryRealtime, int which) {
25686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer == null) {
25696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
25706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
25726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
25736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
25756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getVideoTurnedOnTime(long batteryRealtime, int which) {
25766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer == null) {
25776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
25786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
25806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
25816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
2582617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2583617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteUserActivityLocked(int type) {
2584617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2585617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                initUserActivityLocked();
2586617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2587617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (type < 0) type = 0;
2588617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1;
25894cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUserActivityCounters[type].stepAtomic();
2590617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
25915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2592617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2593617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
2594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
2595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
25965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2597617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2598617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
2599617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2600617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
2601617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
2603617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2605617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
2606617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2608617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
2609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2610617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
26141719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff                    ? (TrafficStats.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2616244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
26176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
26186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear all stats for this uid.  Returns true if the uid is completely
26196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * inactive so can be dropped.
26206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
26216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        boolean reset() {
26226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean active = false;
26235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
262458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
262558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false);
262658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= mWifiRunning;
26276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
26299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false);
26306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mFullWifiLockOut;
26316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer != null) {
26339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mScanWifiLockTimer.reset(BatteryStatsImpl.this, false);
26346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mScanWifiLockOut;
26356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
26379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false);
26386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mWifiMulticastEnabled;
26396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
26419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false);
26426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mAudioTurnedOn;
26436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
26459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false);
26466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mVideoTurnedOn;
26476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
26496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0;
26506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0;
26515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
26526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
26536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
26546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUserActivityCounters[i].reset(false);
26556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
26566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
26586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWakelockStats.size() > 0) {
26596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator();
26606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
26616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Wakelock> wakelockEntry = it.next();
26626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Wakelock wl = wakelockEntry.getValue();
26636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (wl.reset()) {
26646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
26656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
26666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
26676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
26686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
26696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mSensorStats.size() > 0) {
26716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator();
26726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
26736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<Integer, Sensor> sensorEntry = it.next();
26746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Sensor s = sensorEntry.getValue();
26756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (s.reset()) {
26766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
26776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
26786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
26796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
26806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
26816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mProcessStats.size() > 0) {
26836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator();
26846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
26856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Proc> procEntry = it.next();
26866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    procEntry.getValue().detach();
26876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
26886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mProcessStats.clear();
26896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mPids.size() > 0) {
26919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; !active && i<mPids.size(); i++) {
26929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    Pid pid = mPids.valueAt(i);
26939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    if (pid.mWakeStart != 0) {
26949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        active = true;
26959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    }
26969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
26979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
26986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mPackageStats.size() > 0) {
26996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator();
27006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Pkg> pkgEntry = it.next();
27026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Pkg p = pkgEntry.getValue();
27036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    p.detach();
27046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (p.mServiceStats.size() > 0) {
27056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        Iterator<Map.Entry<String, Pkg.Serv>> it2
27066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                                = p.mServiceStats.entrySet().iterator();
27076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        while (it2.hasNext()) {
27086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            Map.Entry<String, Pkg.Serv> servEntry = it2.next();
27096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            servEntry.getValue().detach();
27106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
27116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mPackageStats.clear();
27146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPids.clear();
27179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
27186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!active) {
271958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer != null) {
272058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer.detach();
27216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer != null) {
27236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mFullWifiLockTimer.detach();
27246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mScanWifiLockTimer != null) {
27266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mScanWifiLockTimer.detach();
27276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer != null) {
27296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mWifiMulticastTimer.detach();
27306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer != null) {
27326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mAudioTurnedOnTimer.detach();
27336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer != null) {
27356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mVideoTurnedOnTimer.detach();
27366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mUserActivityCounters != null) {
27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
27396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUserActivityCounters[i].detach();
27406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return !active;
27456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
27465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
278258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
27836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
278458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.writeToParcel(out, batteryRealtime);
27856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
2786617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
27876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
27896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
27906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
2791617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
27926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
27936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer != null) {
27956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
27966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
27976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
27986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
27996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
28016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer.writeToParcel(out, batteryRealtime);
28036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
28076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime);
28096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
28136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime);
28156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
2819617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
2820617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2821617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
2822617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
28236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
2825617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
28359e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) {
28369e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // We will just drop some random set of wakelocks if
28379e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // the previous run of the system was an older version
28389e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // that didn't impose a limit.
28399e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(wakelockName, wakelock);
28409e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
287658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunning = false;
28776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
287858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
287958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiRunningTimers, mUnpluggables, in);
28806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
288158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = null;
28826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2883105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
28846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
28850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
288658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mFullWifiLockTimers, mUnpluggables, in);
28876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer = null;
28896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2890105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
28916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
28920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
289358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mScanWifiLockTimers, mUnpluggables, in);
28946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mScanWifiLockTimer = null;
28966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastEnabled = false;
28986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
28990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
290058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiMulticastTimers, mUnpluggables, in);
2901617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
29026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer = null;
29036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mAudioTurnedOn = false;
29056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
29076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
29086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer = null;
29106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mVideoTurnedOn = false;
29126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
29146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
29156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer = null;
29176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
2919617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2920617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2921617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
2922617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
29236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUserActivityCounters = null;
2925617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2935c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2940c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2945c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2954c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, type, pool, unpluggables, in);
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
29646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                boolean wlactive = false;
29656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerFull != null) {
29669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false);
29676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
29686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerPartial != null) {
29699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false);
29706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
29716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerWindow != null) {
29729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false);
29736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
29746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (!wlactive) {
29756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerFull != null) {
29766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull.detach();
29776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull = null;
29786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
29796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerPartial != null) {
29806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial.detach();
29816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial = null;
29826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
29836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerWindow != null) {
29846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow.detach();
29856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow = null;
29866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
29876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
29886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return !wlactive;
29896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
3019c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
30205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3025c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
3033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in);
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
30409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (mTimer.reset(BatteryStatsImpl.this, true)) {
30416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mTimer = null;
30426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return true;
30436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return false;
30456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3059eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3060eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3086eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Amount of time the process was running in the foreground.
3087eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3088eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mForegroundTime;
3089eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3090eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3106eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from a previous save.
3107eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3108eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLoadedForegroundTime;
3109eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3110eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3126eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from the previous run
3127eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3128eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLastForegroundTime;
3129eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3130eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3145eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
3146eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time since unplugged.
3147eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3148eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mUnpluggedForegroundTime;
3149eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3150e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            SamplingCounter[] mSpeedBins;
3151e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3152287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            ArrayList<ExcessivePower> mExcessivePower;
31539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
3156e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[getCpuSpeedSteps()];
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3158e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
3163eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = mForegroundTime;
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
31696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
31706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
31716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i = 0; i < mSpeedBins.length; i++) {
31726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
31736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
31746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUnpluggables.remove(c);
31756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = null;
31766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
31776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
31786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
31795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3180287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public int countExcessivePowers() {
3181287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                return mExcessivePower != null ? mExcessivePower.size() : 0;
31829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
31839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3184287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public ExcessivePower getExcessivePower(int i) {
3185287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower != null) {
3186287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    return mExcessivePower.get(i);
31879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
31889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return null;
31899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
31909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
31919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            public void addExcessiveWake(long overTime, long usedTime) {
3192287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3193287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
31949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
3195287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3196287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_WAKE;
31979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.overTime = overTime;
31989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.usedTime = usedTime;
3199287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
32009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3202287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public void addExcessiveCpu(long overTime, long usedTime) {
3203287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3204287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
3205287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                }
3206287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3207287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_CPU;
3208287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.overTime = overTime;
3209287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.usedTime = usedTime;
3210287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
3211287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
3212287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
3213287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            void writeExcessivePowerToParcelLocked(Parcel out) {
3214287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
32159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeInt(0);
32169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    return;
32179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3219287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                final int N = mExcessivePower.size();
32209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                out.writeInt(N);
32219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3222287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = mExcessivePower.get(i);
3223287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    out.writeInt(ew.type);
32249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.overTime);
32259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.usedTime);
32269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32297b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            boolean readExcessivePowerFromParcelLocked(Parcel in) {
32309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                final int N = in.readInt();
32319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (N == 0) {
3232287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = null;
32337b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return true;
32349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32367b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (N > 10000) {
32377b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many excessive power entries " + N);
32387b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return false;
32397b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
32407b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn
3241287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower = new ArrayList<ExcessivePower>();
32429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3243287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = new ExcessivePower();
3244287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ew.type = in.readInt();
32459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.overTime = in.readLong();
32469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.usedTime = in.readLong();
3247287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower.add(ew);
32489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32497b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                return true;
32509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
3255eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mForegroundTime);
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
3259eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLoadedForegroundTime);
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
3263eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mUnpluggedForegroundTime);
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
3265e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3266e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                out.writeInt(mSpeedBins.length);
3267e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
32686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
32696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
32706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(1);
32716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.writeToParcel(out);
32726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
32736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(0);
32746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3275e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
32769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3277287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                writeExcessivePowerToParcelLocked(out);
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
3283eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime = in.readLong();
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
3287eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLoadedForegroundTime = in.readLong();
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
32893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastUserTime = 0;
32903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastSystemTime = 0;
32913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastForegroundTime = 0;
32923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastStarts = 0;
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
3295eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = in.readLong();
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
3297e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3298e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                int bins = in.readInt();
32996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                int steps = getCpuSpeedSteps();
33006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps];
3301e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < bins; i++) {
33026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (in.readInt() != 0) {
33036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = new SamplingCounter(mUnpluggables, in);
33046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3305e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
33069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3307287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                readExcessivePowerFromParcelLocked(in);
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public void addForegroundTimeLocked(long ttime) {
3320eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime += ttime;
3321eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3322eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
33366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
33526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
3360eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public long getForegroundTime(int which) {
3361eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                long val;
3362eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                if (which == STATS_LAST) {
3363eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mLastForegroundTime;
3364eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                } else {
3365eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mForegroundTime;
3366eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    if (which == STATS_CURRENT) {
3367eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mLoadedForegroundTime;
33686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
3369eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mUnpluggedForegroundTime;
3370eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    }
3371eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                }
3372eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                return val;
3373eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3374eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3375eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
33846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3390e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3391e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /* Called by ActivityManagerService when CPU times are updated. */
3392e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public void addSpeedStepTimes(long[] values) {
3393e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length && i < values.length; i++) {
33946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    long amt = values[i];
33956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (amt != 0) {
33966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        SamplingCounter c = mSpeedBins[i];
33976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        if (c == null) {
33986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            mSpeedBins[i] = c = new SamplingCounter(mUnpluggables);
33996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
34006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.addCountAtomic(values[i]);
34016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3402e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3403e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
3404e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3405e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            @Override
3406e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public long getTimeAtCpuSpeedStep(int speedStep, int which) {
3407e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                if (speedStep < mSpeedBins.length) {
34086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[speedStep];
34096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return c != null ? c.getCountLocked(which) : 0;
3410e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                } else {
3411e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return 0;
3412e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3413e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
34606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
34616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
34626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
34635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
34673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastWakeups = 0;
34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
35096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
36246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                void detach() {
36256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUnpluggables.remove(this);
36266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
36275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
36403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStartTime = 0;
36413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStarts = 0;
36423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastLaunches = 0;
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
37296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
37466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
37636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        public SparseArray<? extends Pid> getPidStats() {
3800b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            return mPids;
3801b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        }
38025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
38039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public Pid getPidStatsLocked(int pid) {
38049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Pid p = mPids.get(pid);
38059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p == null) {
38069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p = new Pid();
38079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mPids.put(pid, p);
38089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
38099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return p;
38109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
38119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
38449e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) {
38459e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    name = BATCHED_WAKELOCK_NAME;
38469e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = mWakelockStats.get(name);
38479e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
38489e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (wl == null) {
38499e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = new Wakelock();
38509e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(name, wl);
38519e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
38580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL,
38590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mPartialTimers, mUnpluggables);
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
38660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL,
38670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mFullTimers, mUnpluggables);
38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
38740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW,
38750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mWindowTimers, mUnpluggables);
38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3897c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
3899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables);
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStartWakeLocked(int pid, String name, int type) {
3908c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39121ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
39139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = getPidStatsLocked(pid);
3914b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p.mWakeStart == 0) {
3915b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                    p.mWakeStart = SystemClock.elapsedRealtime();
3916b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                }
39179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStopWakeLocked(int pid, String name, int type) {
3921c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39251ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
39269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = mPids.get(pid);
3927b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p != null && p.mWakeStart != 0) {
39289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart;
39299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeStart = 0;
39309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
39319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
39329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
39339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
39349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) {
39359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Proc p = getProcessStatsLocked(proc);
39369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
39379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p.addExcessiveWake(overTime, usedTime);
39389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3941287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) {
3942287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            Proc p = getProcessStatsLocked(proc);
3943287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            if (p != null) {
3944287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                p.addExcessiveCpu(overTime, usedTime);
3945287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
3946287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
3947287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
3949c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
39525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
3957c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
39605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
3964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
39675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
3971c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
3974244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
39831afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = new JournaledFile(new File(filename), new File(filename + ".tmp"));
39840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = new MyHandler();
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
39860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables);
3987617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
39880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables);
3989617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3990617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
39910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables);
39925284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
39930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables);
3994627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
39950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables);
3996627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
39970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables);
3998627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
39990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables);
400058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables);
40010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables);
40020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables);
40030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables);
40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
40056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
4012633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
40136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = 0;
4014633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
4015c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
40160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
40201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
40210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
40220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void setCallback(BatteryCallback cb) {
40270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mCallback = cb;
40280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
40290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
4030e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public void setNumSpeedSteps(int steps) {
4031e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (sNumSpeedSteps == 0) sNumSpeedSteps = steps;
4032e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4033e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4034f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void setRadioScanningTimeout(long timeout) {
4035f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneSignalScanningTimer != null) {
4036f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.setTimeout(timeout);
4037f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
4038f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
4039f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
40400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
40410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingOldHistoryLocked() {
40420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
40430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
40440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
40451fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        mHistoryReadTmp.clear();
40460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
40470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
4048ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return (mHistoryIterator = mHistory) != null;
4049ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4050ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
40510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
40520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextOldHistoryLocked(HistoryItem out) {
40530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize();
40540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!end) {
40551fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mHistoryReadTmp.readDelta(mHistoryBuffer);
40561fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW;
40570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4058ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        HistoryItem cur = mHistoryIterator;
4059ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (cur == null) {
40600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (!mReadOverflow && !end) {
40610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "Old history ends before new history!");
40620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
4063ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return false;
4064ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4065ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        out.setTo(cur);
4066ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mHistoryIterator = cur.next;
40670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!mReadOverflow) {
40680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (end) {
40690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "New history ends before old history!");
40701fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else if (!out.same(mHistoryReadTmp)) {
40710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
40720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                PrintWriter pw = new PrintWriter(new LogWriter(android.util.Log.WARN, TAG));
40730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Histories differ!");
40740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Old history:");
40750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, out, now);
40760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("New history:");
40771fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, now);
40780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
40790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4080ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return true;
4081ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4082ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
40840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingOldHistoryLocked() {
40850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
40860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
40870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
40880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
40890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
40900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingHistoryLocked() {
40910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
40920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
40930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
40940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
40950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
40960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return mHistoryBuffer.dataSize() > 0;
40970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
40980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
40990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextHistoryLocked(HistoryItem out) {
41011fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        final int pos = mHistoryBuffer.dataPosition();
41021fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        if (pos == 0) {
41031fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            out.clear();
41041fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        }
41051fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        boolean end = pos >= mHistoryBuffer.dataSize();
41060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (end) {
41070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return false;
41080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
41090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41101fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        out.readDelta(mHistoryBuffer);
41110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return true;
41120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingHistoryLocked() {
41160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
41170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
411832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
41195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
412032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    @Override
4121b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    public long getHistoryBaseTime() {
4122b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        return mHistoryBaseTime;
4123b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    }
41245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4125b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    @Override
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public boolean isScreenOn() {
41359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return mScreenOn;
41369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
41379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
41386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void initTimes() {
41396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryRealtime = mTrackBatteryPastUptime = 0;
41406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryUptime = mTrackBatteryPastRealtime = 0;
41416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
41426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
41436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
41446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
41456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
41465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4147c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    void initDischarge() {
4148c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mLowDischargeAmountSinceCharge = 0;
4149c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mHighDischargeAmountSinceCharge = 0;
4150c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = 0;
4151c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = 0;
4152c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = 0;
4153c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = 0;
4154c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4155c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
41566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void resetAllStatsLocked() {
41576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mStartCount = 0;
41586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
41599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mScreenOnTimer.reset(this, false);
41606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
41619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mScreenBrightnessTimer[i].reset(this, false);
41626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
41636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mInputEventCounter.reset(false);
41649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneOnTimer.reset(this, false);
41659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mAudioOnTimer.reset(this, false);
41669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mVideoOnTimer.reset(this, false);
41675284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
41689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneSignalStrengthsTimer[i].reset(this, false);
41696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
41709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneSignalScanningTimer.reset(this, false);
41716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
41729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneDataConnectionsTimer[i].reset(this, false);
41736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
41749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mWifiOnTimer.reset(this, false);
417558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.reset(this, false);
41769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mBluetoothOnTimer.reset(this, false);
41775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
41786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<mUidStats.size(); i++) {
41796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUidStats.valueAt(i).reset()) {
41806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUidStats.remove(mUidStats.keyAt(i));
41816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                i--;
41826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
41836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
41845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
41856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mKernelWakelockStats.size() > 0) {
41866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            for (SamplingTimer timer : mKernelWakelockStats.values()) {
41876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(timer);
41886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
41896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mKernelWakelockStats.clear();
41906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
41916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4192c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
41935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
41946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        clearHistoryLocked();
41956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
41965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
419732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) {
4198c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (oldScreenOn) {
4199c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel;
4200c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4201c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOn += diff;
4202c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOnSinceCharge += diff;
4203c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4204c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4205c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel;
4206c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4207c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOff += diff;
4208c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOffSinceCharge += diff;
4209c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4210c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4211c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (newScreenOn) {
4212c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel;
4213c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = 0;
4214c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4215c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = 0;
4216c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel;
4217c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4218c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4219c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
42206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void setOnBattery(boolean onBattery, int oldStatus, int level) {
42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
422232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            setOnBatteryLocked(onBattery, oldStatus, level);
422332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
422432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    }
422532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
422632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void setOnBatteryLocked(boolean onBattery, int oldStatus, int level) {
422732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        boolean doWrite = false;
422832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE);
422932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        m.arg1 = onBattery ? 1 : 0;
423032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mHandler.sendMessage(m);
423132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mOnBattery = mOnBatteryInternal = onBattery;
423232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
423332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long uptime = SystemClock.uptimeMillis() * 1000;
423432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long mSecRealtime = SystemClock.elapsedRealtime();
423532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long realtime = mSecRealtime * 1000;
423632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (onBattery) {
423732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // We will reset our status if we are unplugging after the
423832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // battery was last full, or the level is at 100, or
423932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // we have gone through a significant charge (from a very low
424032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // level to a now very high level).
424132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (oldStatus == BatteryManager.BATTERY_STATUS_FULL
424232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || level >= 90
424332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || (mDischargeCurrentLevel < 20 && level >= 80)) {
424432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                doWrite = true;
424532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                resetAllStatsLocked();
424632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeStartLevel = level;
424732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
424832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
424932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
425032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
425132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: "
425232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
425332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
425432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryUptimeStart = uptime;
425532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryRealtimeStart = realtime;
425632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
425732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
425832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = mDischargeUnplugLevel = level;
425932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mScreenOn) {
426032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = level;
426132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = 0;
42626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
426332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = 0;
426432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = level;
42656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
426632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOn = 0;
426732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOff = 0;
426832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
426932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        } else {
427032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
427132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
427232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
427332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: "
427432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
427532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
427632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
427732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
427832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = level;
427932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (level < mDischargeUnplugLevel) {
428032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;
428132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level;
428232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
428332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn);
428432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
428532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
428632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) {
428732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mFile != null) {
428832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                writeAsyncLocked();
42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // This should probably be exposed in the API, though it's not critical
42946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    private static final int BATTERY_PLUGGED_NONE = 0;
42955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void setBatteryState(int status, int health, int plugType, int level,
42976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int temp, int volt) {
429832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        synchronized(this) {
429932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
430032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            int oldStatus = mHistoryCur.batteryStatus;
430132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!mHaveBatteryLevel) {
430232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHaveBatteryLevel = true;
430332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We start out assuming that the device is plugged in (not
430432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // on battery).  If our first report is now that we are indeed
430532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // plugged in, then twiddle our state to correctly reflect that
430632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // since we won't be going through the full setOnBattery().
430732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (onBattery == mOnBattery) {
430832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    if (onBattery) {
430932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
431032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    } else {
431132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
431232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    }
43136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
431432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                oldStatus = status;
43156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
431632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery) {
431732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeCurrentLevel = level;
431832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = true;
43196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
432032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery != mOnBattery) {
432132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHistoryCur.batteryLevel = (byte)level;
43226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryStatus = (byte)status;
43236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryHealth = (byte)health;
43246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryPlugType = (byte)plugType;
43256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryTemperature = (char)temp;
43266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryVoltage = (char)volt;
432732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                setOnBatteryLocked(onBattery, oldStatus, level);
432832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            } else {
432932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                boolean changed = false;
433032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryLevel != level) {
433132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryLevel = (byte)level;
433232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
433332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
433432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryStatus != status) {
433532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryStatus = (byte)status;
433632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
433732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
433832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryHealth != health) {
433932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryHealth = (byte)health;
434032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
434132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
434232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryPlugType != plugType) {
434332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryPlugType = (byte)plugType;
434432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
434532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
434632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (temp >= (mHistoryCur.batteryTemperature+10)
434732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || temp <= (mHistoryCur.batteryTemperature-10)) {
434832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryTemperature = (char)temp;
434932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
435032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
435132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (volt > (mHistoryCur.batteryVoltage+20)
435232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || volt < (mHistoryCur.batteryVoltage-20)) {
435332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryVoltage = (char)volt;
435432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
435532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
435632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (changed) {
435732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    addHistoryRecordLocked(SystemClock.elapsedRealtime());
435832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
43596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
436032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
436132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We don't record history while we are plugged in and fully charged.
436232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // The next time we are unplugged, history will be cleared.
436332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = false;
43646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
43656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4366633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
43675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4368c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
4369c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
43705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4371d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        if (m == null) {
4372d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            // Not crashing might make board bringup easier.
43731afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "Couldn't get kernel wake lock stats");
4374d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            return;
4375d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        }
4376d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen
4377c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
4378c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
4379c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
43805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4381c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
4382c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
43835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
4384c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
4385c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
4386c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4387c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
4388c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
4389c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
4390c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
43915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4392c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
4393c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
4394c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
4395c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
4396c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
4397c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
4398c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
4399c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4400c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4401c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
44029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
44049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
44059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
44089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
44099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
44139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart);
44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
44176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
44249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart);
44269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
44279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
44286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
44379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
44426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
44549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
44576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
44589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44923718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
44933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long getTcpBytes(long current, long[] dataBytes, int which) {
44943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (which == STATS_LAST) {
44953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return dataBytes[STATS_LAST];
44963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
44976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (which == STATS_SINCE_UNPLUGGED) {
44986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) {
44993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return dataBytes[STATS_LAST];
45003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                } else {
45016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return current - dataBytes[STATS_SINCE_UNPLUGGED];
45023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                }
45036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else if (which == STATS_SINCE_CHARGED) {
45046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED];
45053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            }
45063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return current - dataBytes[STATS_CURRENT];
45073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
45083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesSent(int which) {
45121719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getMobileTxBytes(), mMobileDataTx, which);
45133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesReceived(int which) {
45171719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getMobileRxBytes(), mMobileDataRx, which);
45183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesSent(int which) {
45221719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getTotalTxBytes(), mTotalDataTx, which);
45233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesReceived(int which) {
45271719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getTotalRxBytes(), mTotalDataRx, which);
45283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
4530105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4531633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
4532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4533633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
4534105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4535105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
45365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4537633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
45386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mDischargeUnplugLevel;
4539105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
45405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4542633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
4543105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4544633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
4545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4546105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
45475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4548633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
4549e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return mDischargeCurrentLevel;
4550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4552e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    @Override
45533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getLowDischargeAmountSinceCharge() {
45543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4555e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mLowDischargeAmountSinceCharge;
4556e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4557e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel-1;
4558e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4559e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
45603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
45613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
45623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
45633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
45643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getHighDischargeAmountSinceCharge() {
45653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4566e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mHighDischargeAmountSinceCharge;
4567e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4568e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel;
4569e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4570e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
45713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
45723bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
4573c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4574c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOn() {
4575c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4576c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOn;
4577c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4578c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4579c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4580c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4581c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4582c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4583c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4584c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4585c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOnSinceCharge() {
4586c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4587c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOnSinceCharge;
4588c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4589c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4590c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4591c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4592c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4593c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4594c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4595c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4596c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOff() {
4597c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4598c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOff;
4599c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4600c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4601c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4602c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4603c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4604c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4605c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4606c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4607c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOffSinceCharge() {
4608c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4609c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOffSinceCharge;
4610c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4611c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4612c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4613c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4614c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4615c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4616c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
46173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
46183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
4619e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public int getCpuSpeedSteps() {
4620e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return sNumSpeedSteps;
4621e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4622e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
46239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
46259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
46299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
46319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
46339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
46379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
46399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
464132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
46429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
46479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
46499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
465232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * Retrieve the statistics object for a particular process, given
465332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * the name of the process.
465432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @param name process name
465532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @return the statistics object for the process
465632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     */
4657819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public Uid.Proc getProcessStatsLocked(String name, int pid) {
465832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        int uid;
465932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (mUidCache.containsKey(name)) {
466032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            uid = mUidCache.get(name);
466132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        } else {
4662819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani            uid = Process.getUidForPid(pid);
466332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            mUidCache.put(name, uid);
466432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
466532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        Uid u = getUidStatsLocked(uid);
466632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        return u.getProcessStatsLocked(name);
466732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
466832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
466932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    /**
46709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
46729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
46749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
46769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
46809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
46819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
468758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    /**
468858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * Massage data to distribute any reasonable work down to more specific
468958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * owners.  Must only be called on a dead BatteryStats object!
469058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     */
469158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void distributeWorkLocked(int which) {
469258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        // Aggregate all CPU time associated with WIFI.
469358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        Uid wifiUid = mUidStats.get(Process.WIFI_UID);
469458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (wifiUid != null) {
469558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which);
469658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (Uid.Proc proc : wifiUid.mProcessStats.values()) {
469758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which);
469858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<mUidStats.size(); i++) {
469958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    Uid uid = mUidStats.valueAt(i);
470058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (uid.mUid != Process.WIFI_UID) {
470158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        long uidRunningTime = uid.getWifiRunningTime(uSecTime, which);
470258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (uidRunningTime > 0) {
470358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*");
470458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            long time = proc.getUserTime(which);
470558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
470658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mUserTime += time;
470758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mUserTime -= time;
470858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getSystemTime(which);
470958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
471058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mSystemTime += time;
471158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mSystemTime -= time;
471258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getForegroundTime(which);
471358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
471458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mForegroundTime += time;
471558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mForegroundTime -= time;
471658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            for (int sb=0; sb<proc.mSpeedBins.length; sb++) {
471758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                SamplingCounter sc = proc.mSpeedBins[sb];
471858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                if (sc != null) {
471958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = sc.getCountLocked(which);
472058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = (time*uidRunningTime)/totalRunningTime;
472158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    SamplingCounter uidSc = uidProc.mSpeedBins[sb];
472258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    if (uidSc == null) {
472358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidSc = new SamplingCounter(mUnpluggables);
472458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidProc.mSpeedBins[sb] = uidSc;
472558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    }
472658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    uidSc.mCount.addAndGet((int)time);
472758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    sc.mCount.addAndGet((int)-time);
472858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                }
472958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            }
473058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            totalRunningTime -= uidRunningTime;
473158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
473258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
473358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
473458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
473558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
473658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
473758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
47386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void shutdownLocked() {
4739ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSyncLocked();
47406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mShuttingDown = true;
47411afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    }
47425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4743ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    Parcel mPendingWrite = null;
4744ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    final ReentrantLock mWriteLock = new ReentrantLock();
4745ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4746ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeAsyncLocked() {
4747ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(false);
4748ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4749ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4750ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeSyncLocked() {
4751ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(true);
4752ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4753ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4754ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    void writeLocked(boolean sync) {
47551afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
47561afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "writeLocked: no file associated with this instance");
47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
47589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mShuttingDown) {
47616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
47626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
47635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4764ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        Parcel out = Parcel.obtain();
4765ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSummaryToParcel(out);
4766ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mLastWriteTime = SystemClock.elapsedRealtime();
4767ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4768ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mPendingWrite != null) {
4769ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite.recycle();
4770ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4771ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mPendingWrite = out;
4772ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4773ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (sync) {
4774ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            commitPendingDataToDisk();
4775ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } else {
4776ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            Thread thr = new Thread("BatteryStats-Write") {
4777ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                @Override
4778ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                public void run() {
4779ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4780ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    commitPendingDataToDisk();
4781ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                }
4782ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            };
4783ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            thr.start();
4784ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4785ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4786ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4787ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void commitPendingDataToDisk() {
4788f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        final Parcel next;
4789ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        synchronized (this) {
4790ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next = mPendingWrite;
4791ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite = null;
4792f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            if (next == null) {
4793f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                return;
4794f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            }
4795ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4796ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.lock();
4797ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4798ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
47999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
48001afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite());
4801ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            stream.write(next.marshall());
48029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
48038bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn            FileUtils.sync(stream);
48049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
48051afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            mFile.commit();
48069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
48071afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "Error writing battery statistics", e);
4808ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mFile.rollback();
4809ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } finally {
4810ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next.recycle();
4811ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.unlock();
48129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
48169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
48179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
48189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
48199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
48209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
48219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
48229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
48239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
48279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
48299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
48309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
48319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
48329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
48339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
48349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
48391afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
48401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readLocked: no file associated with this instance");
48419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
48429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
48459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
48471afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            File file = mFile.chooseForRead();
48481afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (!file.exists()) {
48491afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
48509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48511afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileInputStream stream = new FileInputStream(file);
48529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
48549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
48559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
48569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
48579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
48589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
48609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
48611afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.e("BatteryStats", "Error reading battery statistics", e);
48629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
48640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long now = SystemClock.elapsedRealtime();
48650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryRecordLocked(now, HistoryItem.CMD_START);
48660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(now, HistoryItem.CMD_START);
48679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
48709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
48719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
487332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    void readHistory(Parcel in) {
48740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBaseTime = in.readLong();
48750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
48760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataSize(0);
48770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
48780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
48790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int bufSize = in.readInt();
48800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int curPos = in.dataPosition();
48810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) {
48820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer too large " + bufSize);
48830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else if ((bufSize&~3) != bufSize) {
48840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer not aligned " + bufSize);
48850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else {
48860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (DEBUG_HISTORY) Slog.i(TAG, "***************** READING NEW HISTORY: " + bufSize
48870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    + " bytes at " + curPos);
48880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.appendFrom(in, curPos, bufSize);
48890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            in.setDataPosition(curPos + bufSize);
489032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
48915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
48920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long oldnow = SystemClock.elapsedRealtime() - (5*60*1000);
48931e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn        if (oldnow > 0) {
48941e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // If the system process has restarted, but not the entire
48951e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // system, then the mHistoryBaseTime already accounts for
48961e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // much of the elapsed time.  We thus want to adjust it back,
48971e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // to avoid large gaps in the data.  We determine we are
48981e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // in this case by arbitrarily saying it is so if at this
48990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // point in boot the elapsed time is already more than 5 minutes.
49001e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            mHistoryBaseTime -= oldnow;
49011e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn        }
490232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
49035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void readOldHistory(Parcel in) {
49050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistory = mHistoryEnd = mHistoryCache = null;
49060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long time;
49070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        while ((time=in.readLong()) >= 0) {
49080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            HistoryItem rec = new HistoryItem(time, in);
49090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            addHistoryRecordLocked(rec);
49100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
49110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
49120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
491332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    void writeHistory(Parcel out) {
49140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.writeLong(mLastHistoryTime);
49150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.writeInt(mHistoryBuffer.dataSize());
49160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: "
49170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition());
49180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize());
49190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
49200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
49210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void writeOldHistory(Parcel out) {
49226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistory;
492332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        while (rec != null) {
492432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (rec.time >= 0) rec.writeToParcel(out, 0);
492532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            rec = rec.next;
492632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
492732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        out.writeLong(-1);
492832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
49295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
49319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
49329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
49331afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readFromParcel: version got " + version
49349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
49359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
49369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
493832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        readHistory(in);
49390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        readOldHistory(in);
49405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
49429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
49439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
49459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
49466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
4947633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
49483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
49493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
4950c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
4951c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
49525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
49545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
49569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
4957617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
4958617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
4959617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4960617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
49619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
49635284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
4964627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
4965627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
4966f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in);
4967627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
4968627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
4969627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
4970105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
4971105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
497258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
497358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in);
4974105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
4975105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4977c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
49781afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NKW > 10000) {
49791afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW);
49801afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
49811afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
4982c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
4983c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
4984c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
4985c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
4986c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4987c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4988e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4989e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
4990e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
49919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
49921afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NU > 10000) {
49931afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many uids " + NU);
49941afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
49951afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
49969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
49979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
49989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
49999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
50009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
500158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            u.mWifiRunning = false;
50026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
500358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.readSummaryFromParcelLocked(in);
50046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5005105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
50066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
50076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
50086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5009105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
50106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
50116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
50126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
50135347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastEnabled = false;
50146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
50156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
50166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
50176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mAudioTurnedOn = false;
50186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
50196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in);
50206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
50216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mVideoTurnedOn = false;
50226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
50236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in);
50246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
50255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
5026617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
5027617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
5028617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
5029617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5030617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5031617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
5032617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5033617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
50345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
50367b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NW > 100) {
50371afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many wake locks " + NW);
50381afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
50391afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
50409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
50419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
50429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
50439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
50449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
50459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
50469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
50479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
50489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
50499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
50509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
50529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
50547b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
50551afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many sensors " + NP);
50561afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
50571afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
50589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
50609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
50619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
50629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
50639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
50649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
50659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
50677b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
50681afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many processes " + NP);
50691afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
50701afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
50719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
50729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
507758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                int NSB = in.readInt();
50787b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NSB > 100) {
50797b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many speed bins " + NSB);
50807b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
50817b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
508258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                p.mSpeedBins = new SamplingCounter[NSB];
508358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<NSB; i++) {
508458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (in.readInt() != 0) {
508558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i] = new SamplingCounter(mUnpluggables);
508658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i].readSummaryFromParcelLocked(in);
508758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
508858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
50897b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (!p.readExcessivePowerFromParcelLocked(in)) {
50907b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
50917b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
50951afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
50961afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many packages " + NP);
50971afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
50981afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
51029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
51047b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NS > 1000) {
51057b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many services " + NS);
51067b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
51077b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
51089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
51099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
51119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
51129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
51139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
51149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
51279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
51290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
51300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
51310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
51359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
513932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        writeHistory(out);
51400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        writeOldHistory(out);
51415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
51436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED));
51446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
51456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED));
51466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
51476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5148633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
5149e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getLowDischargeAmountSinceCharge());
5150e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getHighDischargeAmountSinceCharge());
5151c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOnSinceCharge());
5152c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOffSinceCharge());
51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5155617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5156617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5157617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5158617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
51605284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5161627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5162627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5163f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5164627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5165627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5166627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5167105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
516858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5169105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5171c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
5172c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
5173c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
5174c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
5175c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
5176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
5177c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
5178c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
5179c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
5180c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
51825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5183e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
51849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
51869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
51889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
51895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
519058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (u.mWifiRunningTimer != null) {
51916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
519258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
51936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
51946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
51956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mFullWifiLockTimer != null) {
51976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
51986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
51996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
52006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
52016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
52026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mScanWifiLockTimer != null) {
52036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
52046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
52066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
52076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
52086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mWifiMulticastTimer != null) {
52096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
52106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
52126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
52136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
52146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mAudioTurnedOnTimer != null) {
52156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
52166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
52186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
52196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
52206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mVideoTurnedOnTimer != null) {
52216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
52226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
52246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
52256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
5228617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
5229617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
5230617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
5231617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5232617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
5233617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5234617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
52355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
52499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
52529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
52559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
52599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
529058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    final int N = ps.mSpeedBins.length;
529158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    out.writeInt(N);
529258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    for (int i=0; i<N; i++) {
529358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (ps.mSpeedBins[i] != null) {
529458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(1);
529558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            ps.mSpeedBins[i].writeSummaryFromParcelLocked(out);
529658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        } else {
529758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(0);
529858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
529958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
5300287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ps.writeExcessivePowerToParcelLocked(out);
53019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
53029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
53059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
53069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
53079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
53089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
53099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
53109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
53119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
53129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
53139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
53149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
53159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
53169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
53179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
53189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
53199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
53209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
53219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
53229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
53239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
53249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
53269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
53286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED));
53296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED));
53309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
53349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
53359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
53379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
53389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
53399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
53409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
53419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
534332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        readHistory(in);
53445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
53473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastUptime = 0;
53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
53493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastRealtime = 0;
53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
53510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in);
5352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
53530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i,
53540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
53579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
53580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
53595284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
53600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i,
53610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5362627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
53630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in);
5364627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
53650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i,
53660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5367627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5368105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
53690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
537058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
537158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
5372105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
53730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
53749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
53759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
53763bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastUptime = 0;
53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
53793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastRealtime = 0;
53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
53849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
53886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5389633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
53903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
53913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
5392c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = in.readInt();
5393c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
5394c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = in.readInt();
5395c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
53969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_LAST] = in.readLong();
53996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1;
54003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_LAST] = in.readLong();
54016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1;
54023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_LAST] = in.readLong();
54036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1;
54043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_LAST] = in.readLong();
54056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1;
54063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
54073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = in.readLong();
54083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
54093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
54103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = in.readInt();
54113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
54123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
5413c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
5414c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
5415c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5416c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5417c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
5418244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel
5419c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
5420c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
5421c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5422c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
54235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
542758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiRunningTimers.clear();
542858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mFullWifiLockTimers.clear();
542958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mScanWifiLockTimers.clear();
543058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiMulticastTimers.clear();
54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5432e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5433e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
54349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
54359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
54369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
54379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
54389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
54399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
54409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
54419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
54453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, true, flags);
54463bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
54473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
54483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public void writeToParcelWithoutUids(Parcel out, int flags) {
54493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, false, flags);
54509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    @SuppressWarnings("unused")
54533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void writeToParcelLocked(Parcel out, boolean inclUids, int flags) {
54540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
54550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
54560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
54589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
54599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
54609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
54615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
54635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
546432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        writeHistory(out);
54655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
54679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
54689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
54699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
5470617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5471617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
5472617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5473617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
54755284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5476627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
5477627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5478f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime);
5479627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5480627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
5481627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5482105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
548358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime);
5484105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
54959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
54966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5497633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
54983bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mLowDischargeAmountSinceCharge);
54993bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mHighDischargeAmountSinceCharge);
5500c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOn);
5501c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOnSinceCharge);
5502c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOff);
5503c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOffSinceCharge);
55049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED));
55076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED));
55086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED));
55096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED));
55103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Write radio uptime for data
55123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeLong(getRadioDataUptime());
55133f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
55143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeInt(getBluetoothPingCount());
55153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55163bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
55173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(mKernelWakelockStats.size());
55183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
55193bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                SamplingTimer kwlt = ent.getValue();
55203bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (kwlt != null) {
55213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(1);
55223bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeString(ent.getKey());
55233bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
55243bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                } else {
55253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(0);
55263bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                }
5527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
55283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
55293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
5530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5531e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5532e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
5533e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
55343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
55353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            int size = mUidStats.size();
55363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(size);
55373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (int i = 0; i < size; i++) {
55383bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                out.writeInt(mUidStats.keyAt(i));
55393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                Uid uid = mUidStats.valueAt(i);
55409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                uid.writeToParcelLocked(out, batteryRealtime);
55423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
55433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
55443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
55459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
55499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
55509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
55519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
55529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
55559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
55569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
55585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void prepareForDumpLocked() {
55600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to retrieve current kernel wake lock stats before printing.
55610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
55620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
55630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
55641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
55659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
55661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
55671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
55681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
5569617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
55701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
55711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
5572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
55731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
55741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
55751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
55761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
55775284090631e638b916d9a453212e9dc802656a67Wink Saville            for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
55781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
55791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
5580627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
5581f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            pr.println("*** Signal scanning :");
5582f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.logState(pr, "  ");
5583627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
55841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
55851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
55861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
55871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
55881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
55891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
559058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.logState(pr, "  ");
55911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
55921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
55939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
55959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5597