BatteryStatsImpl.java revision 1059c3c30ad96a15695c1a92ae8896e078a6309f
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.IFACE_ALL;
201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.UID_ALL;
211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.text.format.DateUtils.SECOND_IN_MILLIS;
221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn
233f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothDevice;
243f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset;
251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.content.res.Resources;
261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.ConnectivityManager;
271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.NetworkStats;
286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackbornimport android.os.BatteryManager;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
308bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils;
310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Handler;
320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Message;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
36c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
39f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState;
40e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
41627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackbornimport android.util.LogWriter;
441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
461afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport android.util.Slog;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
48ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackbornimport android.util.TimeUtils;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.R;
511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.net.NetworkStatsFactory;
521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.util.JournaledFile;
531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.google.android.collect.Sets;
541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
641059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.util.HashSet;
65c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator;
665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganeshimport java.util.List;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
684cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger;
69ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackbornimport java.util.concurrent.locks.ReentrantLock;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
7932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    private static final boolean DEBUG_HISTORY = false;
80e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn    private static final boolean USE_OLD_HISTORY = false;   // for debugging.
815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
821059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    // TODO: remove "tcp" from network methods, since we measure total stats.
831059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
88e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn    private static final int VERSION = 61 + (USE_OLD_HISTORY ? 1000 : 0);
89e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // Maximum number of items we will record in the history.
917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_HISTORY_ITEMS = 2000;
925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
93f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    // No, really, THIS is the maximum number of items we will record in the history.
94f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    private static final int MAX_MAX_HISTORY_ITEMS = 3000;
95f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
969e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // The maximum number of names wakelocks we will keep track of
979e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // per uid; once the limit is reached, we batch the remaining wakelocks
989e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // in to one common name.
997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_WAKELOCKS_PER_UID = 30;
1005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1019e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    private static final String BATCHED_WAKELOCK_NAME = "*overflow*";
1025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
103e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private static int sNumSpeedSteps;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1051afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    private final JournaledFile mFile;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_UPDATE_WAKELOCKS = 1;
1080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_REPORT_POWER_CHANGE = 2;
109287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    static final long DELAY_UPDATE_WAKELOCKS = 5*1000;
1100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public interface BatteryCallback {
1120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryNeedsCpuUpdate();
1130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryPowerChanged(boolean onBattery);
1140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
1150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final class MyHandler extends Handler {
1170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        @Override
1180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void handleMessage(Message msg) {
1190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            BatteryCallback cb = mCallback;
1200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            switch (msg.what) {
1210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_UPDATE_WAKELOCKS:
1220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryNeedsCpuUpdate();
1240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_REPORT_POWER_CHANGE:
1270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryPowerChanged(msg.arg1 != 0);
1290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
1320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
1330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
1340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private final MyHandler mHandler;
1360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private BatteryCallback mCallback;
1380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
149c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>();
150c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>();
151c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>();
152c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers
153c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            = new SparseArray<ArrayList<StopwatchTimer>>();
15458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>();
15558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>();
15658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mScanWifiLockTimers = new ArrayList<StopwatchTimer>();
15758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>();
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    // Last partial timers we use for distributing CPU usage.
1600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>();
1610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
1655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mShuttingDown;
1675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    long mHistoryBaseTime;
1696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mHaveBatteryLevel = false;
1706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mRecordingHistory = true;
1716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mNumHistoryItems;
1720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1731fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    static final int MAX_HISTORY_BUFFER = 128*1024; // 128KB
1741fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    static final int MAX_MAX_HISTORY_BUFFER = 144*1024; // 144KB
1750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final Parcel mHistoryBuffer = Parcel.obtain();
1760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryLastWritten = new HistoryItem();
1770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryLastLastWritten = new HistoryItem();
1781fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    final HistoryItem mHistoryReadTmp = new HistoryItem();
1790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    int mHistoryBufferLastPos = -1;
1800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    boolean mHistoryOverflow = false;
1810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    long mLastHistoryTime = 0;
1820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryCur = new HistoryItem();
1840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistory;
1866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryEnd;
1879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    HistoryItem mHistoryLastEnd;
1886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryCache;
1890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private HistoryItem mHistoryIterator;
1910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private boolean mReadOverflow;
1920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private boolean mIteratingHistory;
1935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
2075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
209c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mScreenOnTimer;
2103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
211617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mScreenBrightnessBin = -1;
212c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
2135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
214617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    Counter mInputEventCounter;
2155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
217c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mPhoneOnTimer;
2185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
219244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mAudioOn;
220244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mAudioOnTimer;
2215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
222244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mVideoOn;
223244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mVideoOnTimer;
2245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
225627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
226e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    int mPhoneSignalStrengthBinRaw = -1;
227c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneSignalStrengthsTimer =
2285284090631e638b916d9a453212e9dc802656a67Wink Saville            new StopwatchTimer[SignalStrength.NUM_SIGNAL_STRENGTH_BINS];
229f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
230f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    StopwatchTimer mPhoneSignalScanningTimer;
231f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
232627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
2335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    final StopwatchTimer[] mPhoneDataConnectionsTimer =
234c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
2355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
236105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
237c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiOnTimer;
238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mWifiOnUid = -1;
239d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
24058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    boolean mGlobalWifiRunning;
24158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    StopwatchTimer mGlobalWifiRunningTimer;
2425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
243105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
244c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mBluetoothOnTimer;
2453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /** Bluetooth headset object */
2473f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    BluetoothHeadset mBtHeadset;
2483f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
2593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
2623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
266633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeStartLevel;
2676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mDischargeUnplugLevel;
268633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeCurrentLevel;
2693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mLowDischargeAmountSinceCharge;
2703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mHighDischargeAmountSinceCharge;
271c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeScreenOnUnplugLevel;
272c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeScreenOffUnplugLevel;
273c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOn;
274c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOnSinceCharge;
275c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOff;
276c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOffSinceCharge;
277244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
279244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    // Mobile data transferred while on battery
2813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataTx = new long[4];
2823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataRx = new long[4];
2833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataTx = new long[4];
2843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataRx = new long[4];
2853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataUptime;
2873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataStart;
2883718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingCount;
2903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingStart = -1;
2913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
292f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private int mPhoneServiceState = -1;
293e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int mPhoneServiceStateRaw = -1;
294e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int mPhoneSimStateRaw = -1;
295f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
296c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
297c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
298c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
2995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private final HashMap<String, SamplingTimer> mKernelWakelockStats =
300c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, SamplingTimer>();
3015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
302c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public Map<String, ? extends SamplingTimer> getKernelWakelockStats() {
303c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mKernelWakelockStats;
304c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
3055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
306c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static int sKernelWakelockUpdateVersion = 0;
3075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int[] PROC_WAKELOCKS_FORMAT = new int[] {
309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
310c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 1: count
311c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
312c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
313c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
314c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 5: totalTime
315c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    };
3165a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
317c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final String[] mProcWakelocksName = new String[3];
318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final long[] mProcWakelocksData = new long[3];
3195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
320c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
321c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added
322c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * to mKernelWakelockStats.
323c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
3245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private final Map<String, KernelWakelockStats> mProcWakelockFileStats =
325c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, KernelWakelockStats>();
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>();
3285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory();
3301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
3311059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    /** Network ifaces that {@link ConnectivityManager} has claimed as mobile. */
3321059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private HashSet<String> mMobileIfaces = Sets.newHashSet();
3331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
3361afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
3370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
346617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
348e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class Counter extends BatteryStats.Counter implements Unpluggable {
3494cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        final AtomicInteger mCount = new AtomicInteger();
3506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLoadedCount;
352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLastCount;
353617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mUnpluggedCount;
354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mPluggedCount;
3555a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables, Parcel in) {
3576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
3584cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = in.readInt();
3594cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
360617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLoadedCount = in.readInt();
3613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
362617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = in.readInt();
363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
365617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables) {
3676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void writeToParcel(Parcel out) {
3724cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(mCount.get());
373617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLoadedCount);
374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mUnpluggedCount);
375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
376617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void unplug(long batteryUptime, long batteryRealtime) {
3784cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount;
3794cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
380617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void plug(long batteryUptime, long batteryRealtime) {
3834cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = mCount.get();
384617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
387617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Writes a possibly null Counter to a Parcel.
388617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
389617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param out the Parcel to be written to.
390617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param counter a Counter, or null.
391617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
392617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static void writeCounterToParcel(Parcel out, Counter counter) {
393617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (counter == null) {
394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0); // indicates null
395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return;
396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(1); // indicates non-null
398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
399617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            counter.writeToParcel(out);
400617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
401617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
402617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
403c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
404617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            int val;
405617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (which == STATS_LAST) {
406617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mLastCount;
407617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
4084cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate                val = mCount.get();
4096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
410617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mUnpluggedCount;
4116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
412617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mLoadedCount;
413617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
414617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
415617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
416617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return val;
417617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
418617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
419617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void logState(Printer pw, String prefix) {
4204cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            pw.println(prefix + "mCount=" + mCount.get()
421617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
422617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mUnpluggedCount=" + mUnpluggedCount
423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mPluggedCount=" + mPluggedCount);
424617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4264cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        void stepAtomic() {
4274cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.incrementAndGet();
428617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
429617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
4306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
4316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this counter.
4326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
4336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void reset(boolean detachIfReset) {
4346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount.set(0);
4356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
4366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
4376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
4386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
4396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
4426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
4436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
445617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void writeSummaryFromParcelLocked(Parcel out) {
4464cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            int count = mCount.get();
4474cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(count);
448617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
449617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
450617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void readSummaryFromParcelLocked(Parcel in) {
4514cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mLoadedCount = in.readInt();
4524cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mLoadedCount);
4533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
4544cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount = mLoadedCount;
455617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
456617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
457e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
458e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class SamplingCounter extends Counter {
459e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
460e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) {
461e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables, in);
462e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
463e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
464e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables) {
465e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables);
466e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
467e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4684cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        public void addCountAtomic(long count) {
4694cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.addAndGet((int)count);
470e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
471e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
472e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
473617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
476c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static abstract class Timer extends BatteryStats.Timer implements Unpluggable {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
4786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
4795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
4845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
4875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
4945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
5005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
5065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
5135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
514244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        /**
515244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * Constructs from a parcel.
516244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param type
517244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param unpluggables
518244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param powerType
519244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param in
520244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         */
521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
5236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
5245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
5273bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
5313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables) {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
5386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract long computeRunTimeLocked(long curBatteryRealtime);
5435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract int computeCurrentCountLocked();
5455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
5476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this timer.  Returns true if the timer is inactive
5486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * so can be completely dropped.
5496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
5509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
5516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mTotalTime = mLoadedTime = mLastTime = 0;
5526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount = mLoadedCount = mLastCount = 0;
5536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
5546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
5556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
5576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
5606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
5616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " old mTotalTime=" + mTotalTime);
591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = computeRunTimeLocked(batteryRealtime);
593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = computeCurrentCountLocked();
594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
595c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType
596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + ": new mTotalTime=" + mTotalTime);
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long getTotalTimeLocked(long batteryRealtime, int which) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
6246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
6266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                val = computeCurrentCountLocked();
6416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
6436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
651627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + " mCount=" + mCount
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
655627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
657627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
6605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
6615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long runTime = computeRunTimeLocked(batteryRealtime);
664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Divide by 1000 for backwards compatibility
665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong((runTime + 500) / 1000);
666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount);
667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Multiply by 1000 for backwards compatibility
671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = mLoadedTime = in.readLong() * 1000;
6723bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedTime = mTotalTime;
674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = mLoadedCount = in.readInt();
6753bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedCount = mCount;
677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
6795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class SamplingTimer extends Timer {
6815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported count from /proc/wakelocks.
684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mCurrentReportedCount;
686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported count from /proc/wakelocks when unplug() was last
689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUnpluggedReportedCount;
692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported total_time from /proc/wakelocks.
6955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh         */
696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mCurrentReportedTotalTime;
697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported total_time from /proc/wakelocks when unplug() was last
701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUnpluggedReportedTotalTime;
704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently in a discharge cycle.
707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mInDischarge;
709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
710c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
711c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently recording reported values.
712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mTrackingReportedValues;
7145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /*
716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * A sequnce counter, incremented once for each update of the stats.
717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUpdateVersion;
7195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) {
721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables, in);
722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = in.readInt();
723c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = in.readInt();
724c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = in.readLong();
725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = in.readLong();
726c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
7305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge,
731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                boolean trackReportedValues) {
732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables);
733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = trackReportedValues;
734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setStale() {
738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = false;
739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = 0;
740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = 0;
741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setUpdateVersion(int version) {
744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateVersion = version;
745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getUpdateVersion() {
748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUpdateVersion;
749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
751c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedCount(int count) {
752c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedCount == 0) {
753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = count;
755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = count;
759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedTotalTime(long totalTime) {
762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedTotalTime == 0) {
763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
764c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = totalTime;
765c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
768c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = totalTime;
769c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void unplug(long batteryUptime, long batteryRealtime) {
772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.unplug(batteryUptime, batteryRealtime);
773c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mTrackingReportedValues) {
774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
775c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = mCurrentReportedCount;
776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = true;
778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.plug(batteryUptime, batteryRealtime);
782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = false;
783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
7875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
793c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
7945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            return mTotalTime + (mInDischarge && mTrackingReportedValues
795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
798c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount + (mInDischarge && mTrackingReportedValues
800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mUnpluggedReportedCount);
807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUnpluggedReportedTotalTime);
809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
8129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
8139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, detachIfReset);
8146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            setStale();
8156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
8166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
8175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeSummaryFromParcelLocked(out, batteryRealtime);
820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
8325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /**
834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * State for keeping track of timing information.
835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class StopwatchTimer extends Timer {
8370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final Uid mUid;
838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        final ArrayList<StopwatchTimer> mTimerPool;
8390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mNesting;
841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The last time at which we updated the timer.  If mNesting is > 0,
844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * subtract this from the current battery time to find the amount of
845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * time we have been running since we last computed an update.
846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUpdateTime;
8485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
8509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The total time at which the timer was acquired, to determine if it
851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * was actually held for an interesting duration.
852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mAcquireTime;
854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
855f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        long mTimeout;
856f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
8570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        /**
8580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * For partial wake locks, keep track of whether we are in the list
8590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * to consume CPU cycles.
8600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         */
8610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean mInList;
8620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
8630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables, Parcel in) {
865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables, in);
8660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateTime = in.readLong();
869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
8710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables) {
873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables);
8740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
878f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        void setTimeout(long timeout) {
879f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mTimeout = timeout;
880f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
881f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUpdateTime);
885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
886c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
887c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mNesting > 0) {
889c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
890c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
892c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                super.plug(batteryUptime, batteryRealtime);
893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUpdateTime = batteryRealtime;
894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
895c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
896c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
897c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
898c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
900c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
901c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
902c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
92832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        boolean isRunningLocked() {
92932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            return mNesting > 0;
93032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
93132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                    final long realtime = SystemClock.elapsedRealtime() * 1000;
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9575a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
969c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final ArrayList<StopwatchTimer> pool) {
9705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            final long realtime = SystemClock.elapsedRealtime() * 1000;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
974c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final StopwatchTimer t = pool.get(i);
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
983c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
984c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
985f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) {
986f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                curBatteryRealtime = mUpdateTime + mTimeout;
987f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
994c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
995c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
996c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount;
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
10006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean canDetach = mNesting <= 0;
10019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, canDetach && detachIfReset);
10029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mNesting > 0) {
10039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mUpdateTime = stats.getBatteryRealtimeLocked(
10049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        SystemClock.elapsedRealtime() * 1000);
10059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
10069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mAcquireTime = mTotalTime;
10076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return canDetach;
10086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
10095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
10106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
10116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            super.detach();
10126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mTimerPool != null) {
10136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mTimerPool.remove(this);
10146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
10156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
10165a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
1018c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> readKernelWakelockStats() {
10245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
10253372f2e259247810627fd22033406163284f4f64Johannes Carlsson        byte[] buffer = new byte[8192];
1026c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int len;
10275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1028c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        try {
1029c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            FileInputStream is = new FileInputStream("/proc/wakelocks");
1030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            len = is.read(buffer);
1031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            is.close();
1032c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (len > 0) {
1034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                int i;
1035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (i=0; i<len; i++) {
1036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (buffer[i] == '\0') {
1037c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        len = i;
1038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        break;
1039c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
1040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.FileNotFoundException e) {
1043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
1044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.IOException e) {
1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
1046c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
10475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return parseProcWakelocks(buffer, len);
1049c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
10505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1051c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> parseProcWakelocks(
1052c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            byte[] wlBuffer, int len) {
1053c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        String name;
1054c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int count;
1055c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long totalTime;
10561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        int startIndex;
10571059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        int endIndex;
1058c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int numUpdatedWlNames = 0;
1059c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        // Advance past the first line.
1061c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int i;
1062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++);
1063c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        startIndex = endIndex = i + 1;
1064c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1065c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        synchronized(this) {
1066c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Map<String, KernelWakelockStats> m = mProcWakelockFileStats;
10675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1068c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            sKernelWakelockUpdateVersion++;
1069c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            while (endIndex < len) {
10705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                for (endIndex=startIndex;
10715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                        endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0';
1072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex++);
10733372f2e259247810627fd22033406163284f4f64Johannes Carlsson                endIndex++; // endIndex is an exclusive upper bound.
10743372f2e259247810627fd22033406163284f4f64Johannes Carlsson                // Don't go over the end of the buffer, Process.parseProcLine might
10753372f2e259247810627fd22033406163284f4f64Johannes Carlsson                // write to wlBuffer[endIndex]
10763372f2e259247810627fd22033406163284f4f64Johannes Carlsson                if (endIndex >= (len - 1) ) {
10773372f2e259247810627fd22033406163284f4f64Johannes Carlsson                    return m;
1078e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                }
1079c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1080c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String[] nameStringArray = mProcWakelocksName;
1081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                long[] wlData = mProcWakelocksData;
10822098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // Stomp out any bad characters since this is from a circular buffer
10832098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // A corruption is seen sometimes that results in the vm crashing
10842098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // This should prevent crashes and the line will probably fail to parse
10852098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                for (int j = startIndex; j < endIndex; j++) {
10862098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                    if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?';
10872098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                }
108853b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex,
108953b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                        PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null);
10902098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani
1091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                name = nameStringArray[0];
1092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                count = (int) wlData[1];
1093c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // convert nanoseconds to microseconds with rounding.
1094c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                totalTime = (wlData[2] + 500) / 1000;
1095c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
109653b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                if (parsed && name.length() > 0) {
1097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (!m.containsKey(name)) {
10985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                        m.put(name, new KernelWakelockStats(count, totalTime,
1099c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                sKernelWakelockUpdateVersion));
1100c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        numUpdatedWlNames++;
1101c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    } else {
1102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        KernelWakelockStats kwlStats = m.get(name);
1103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        if (kwlStats.mVersion == sKernelWakelockUpdateVersion) {
1104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount += count;
1105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime += totalTime;
1106c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        } else {
1107c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount = count;
1108c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime = totalTime;
1109c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mVersion = sKernelWakelockUpdateVersion;
1110c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            numUpdatedWlNames++;
1111c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        }
1112c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
111353b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                }
1114c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                startIndex = endIndex;
1115c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1117c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (m.size() != numUpdatedWlNames) {
1118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Don't report old data.
1119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Iterator<KernelWakelockStats> itr = m.values().iterator();
1120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                while (itr.hasNext()) {
1121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (itr.next().mVersion != sKernelWakelockUpdateVersion) {
1122c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        itr.remove();
1123c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
1124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return m;
1127c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1130c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private class KernelWakelockStats {
1131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mCount;
1132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long mTotalTime;
1133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mVersion;
11345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        KernelWakelockStats(int count, long totalTime, int version) {
1136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = count;
1137c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = totalTime;
1138c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mVersion = version;
1139c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1140c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1142c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
11435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh     * Get the KernelWakelockTimer associated with name, and create a new one if one
1144c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * doesn't already exist.
1145c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
1146c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public SamplingTimer getKernelWakelockTimerLocked(String name) {
1147c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer kwlt = mKernelWakelockStats.get(name);
1148c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kwlt == null) {
11495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
1150c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    true /* track reported values */);
1151c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mKernelWakelockStats.put(name, kwlt);
1152c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1153c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return kwlt;
1154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11563718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataPlug(long[] dataTransfer, long currentBytes) {
11576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_LAST] = dataTransfer[STATS_SINCE_UNPLUGGED];
11586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = -1;
11593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataUnplug(long[] dataTransfer, long currentBytes) {
11626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = currentBytes;
11633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11653f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11663f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Radio uptime in microseconds when transferring data. This value is very approximate.
11673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return
11683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private long getCurrentRadioDataUptime() {
11703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        try {
11713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
11723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (!awakeTimeFile.exists()) return 0;
11733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
11743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            String line = br.readLine();
11753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            br.close();
11763f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return Long.parseLong(line) * 1000;
11773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (NumberFormatException nfe) {
11783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
11793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (IOException ioe) {
11803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
11813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
11823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return 0;
11833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11853f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11863f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
11873f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11883718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getRadioDataUptimeMs() {
11893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
11903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
11913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
11923f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh     * Returns the duration that the cell radio was up for data transfers.
11943f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11953f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptime() {
11963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (mRadioDataStart == -1) {
11973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return mRadioDataUptime;
11983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
11993f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentRadioDataUptime() - mRadioDataStart;
12003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
12013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
12023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
12033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int getCurrentBluetoothPingCount() {
12043f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBtHeadset != null) {
12055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            List<BluetoothDevice> deviceList = mBtHeadset.getConnectedDevices();
12065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            if (deviceList.size() > 0) {
12075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                return mBtHeadset.getBatteryUsageHint(deviceList.get(0));
12083f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            }
12093f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
12103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return -1;
12113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12133f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public int getBluetoothPingCount() {
12143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBluetoothPingStart == -1) {
12153f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBluetoothPingCount;
12163f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        } else if (mBtHeadset != null) {
12173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentBluetoothPingCount() - mBluetoothPingStart;
12183f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
121982cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        return 0;
12203f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12213f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12223f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public void setBtHeadset(BluetoothHeadset headset) {
122382cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) {
122482cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani            mBluetoothPingStart = getCurrentBluetoothPingCount();
122582cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        }
12263f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBtHeadset = headset;
12273f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    int mChangedBufferStates = 0;
12300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void addHistoryBufferLocked(long curTime) {
12320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!mHaveBatteryLevel || !mRecordingHistory) {
12330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12361fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        final long timeDiff = (mHistoryBaseTime+curTime) - mHistoryLastWritten.time;
12370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mHistoryBufferLastPos >= 0 && mHistoryLastWritten.cmd == HistoryItem.CMD_UPDATE
12381fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                && timeDiff < 2000
12390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                && ((mHistoryLastWritten.states^mHistoryCur.states)&mChangedBufferStates) == 0) {
12400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // If the current is the same as the one before, then we no
12410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // longer need the entry.
12420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataSize(mHistoryBufferLastPos);
12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(mHistoryBufferLastPos);
12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBufferLastPos = -1;
12450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (mHistoryLastLastWritten.cmd == HistoryItem.CMD_UPDATE
12461fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    && timeDiff < 500 && mHistoryLastLastWritten.same(mHistoryCur)) {
12470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // If this results in us returning to the state written
12480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // prior to the last one, then we can just delete the last
12490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // written one and drop the new one.  Nothing more to do.
12500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryLastWritten.setTo(mHistoryLastLastWritten);
12510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL;
12520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                return;
12530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mChangedBufferStates |= mHistoryLastWritten.states^mHistoryCur.states;
12550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            curTime = mHistoryLastWritten.time - mHistoryBaseTime;
12561fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mHistoryLastWritten.setTo(mHistoryLastLastWritten);
12570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else {
12580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mChangedBufferStates = 0;
12590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        final int dataSize = mHistoryBuffer.dataSize();
12620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (dataSize >= MAX_HISTORY_BUFFER) {
12630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (!mHistoryOverflow) {
12640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryOverflow = true;
12650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                addHistoryBufferLocked(curTime, HistoryItem.CMD_OVERFLOW);
12660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // Once we've reached the maximum number of items, we only
12690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // record changes to the battery level and the most interesting states.
12700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // Once we've reached the maximum maximum number of items, we only
12710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // record changes to the battery level.
12720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (mHistoryLastWritten.batteryLevel == mHistoryCur.batteryLevel &&
12730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    (dataSize >= MAX_MAX_HISTORY_BUFFER
12740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            || ((mHistoryEnd.states^mHistoryCur.states)
12750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                                    & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
12760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                return;
12770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(curTime, HistoryItem.CMD_UPDATE);
12810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
12820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void addHistoryBufferLocked(long curTime, byte cmd) {
12840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int origPos = 0;
12850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mIteratingHistory) {
12860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            origPos = mHistoryBuffer.dataPosition();
12870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
12880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBufferLastPos = mHistoryBuffer.dataPosition();
12900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastLastWritten.setTo(mHistoryLastWritten);
12910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur);
12920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.writeDelta(mHistoryBuffer, mHistoryLastLastWritten);
12930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mLastHistoryTime = curTime;
12940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "Writing history buffer: was " + mHistoryBufferLastPos
12950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " now " + mHistoryBuffer.dataPosition()
12960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " size is now " + mHistoryBuffer.dataSize());
12970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mIteratingHistory) {
12980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(origPos);
12990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
13000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
13010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1302f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    int mChangedStates = 0;
1303f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
13046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime) {
13050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(curTime);
13060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1307e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
1308e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
1309e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
1310e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn
13116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (!mHaveBatteryLevel || !mRecordingHistory) {
13126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
13136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
13149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        // If the current time is basically the same as the last time,
1316f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // and no states have since the last recorded entry changed and
1317f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // are now resetting back to their original value, then just collapse
1318f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // into one record.
13199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE
1320f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+2000)
1321f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && ((mHistoryEnd.states^mHistoryCur.states)&mChangedStates) == 0) {
13229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // If the current is the same as the one before, then we no
13239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // longer need the entry.
13249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE
13251fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+500)
13269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && mHistoryLastEnd.same(mHistoryCur)) {
13279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd.next = null;
13289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.next = mHistoryCache;
13299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryCache = mHistoryEnd;
13309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd = mHistoryLastEnd;
13319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd = null;
13329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            } else {
1333f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                mChangedStates |= mHistoryEnd.states^mHistoryCur.states;
13349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, mHistoryCur);
13359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
13369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return;
13379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
13389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1339f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        mChangedStates = 0;
1340f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
1341f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        if (mNumHistoryItems == MAX_HISTORY_ITEMS
1342f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) {
13437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            addHistoryRecordLocked(curTime, HistoryItem.CMD_OVERFLOW);
13447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
13457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
13466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mNumHistoryItems >= MAX_HISTORY_ITEMS) {
13476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // Once we've reached the maximum number of items, we only
1348f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // record changes to the battery level and the most interesting states.
1349f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // Once we've reached the maximum maximum number of items, we only
13506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // record changes to the battery level.
13516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryEnd != null && mHistoryEnd.batteryLevel
1352f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    == mHistoryCur.batteryLevel &&
1353f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS
1354f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                            || ((mHistoryEnd.states^mHistoryCur.states)
1355f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                                    & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
13566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return;
13576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
13586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
13599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE);
13616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
13625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime, byte cmd) {
13646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistoryCache;
136532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (rec != null) {
136632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCache = rec.next;
136732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
13686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            rec = new HistoryItem();
136932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
13706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur);
13715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(rec);
137332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
13745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(HistoryItem rec) {
13766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mNumHistoryItems++;
137732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        rec.next = null;
13789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mHistoryLastEnd = mHistoryEnd;
137932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mHistoryEnd != null) {
138032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd.next = rec;
138132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd = rec;
138232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
138332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistory = mHistoryEnd = rec;
138432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
138532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
13865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void clearHistoryLocked() {
13880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "********** CLEARING HISTORY!");
1389e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (USE_OLD_HISTORY) {
1390e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            if (mHistory != null) {
1391e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn                mHistoryEnd.next = mHistoryCache;
1392e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn                mHistoryCache = mHistory;
1393e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn                mHistory = mHistoryLastEnd = mHistoryEnd = null;
1394e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            }
1395e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            mNumHistoryItems = 0;
139632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
1397e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn
13986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mHistoryBaseTime = 0;
13990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mLastHistoryTime = 0;
14000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
14010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataSize(0);
14020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
14030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER/2);
14040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL;
14050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.cmd = HistoryItem.CMD_NULL;
14060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBufferLastPos = -1;
14070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryOverflow = false;
140832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
14095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
14106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doUnplugLocked(long batteryUptime, long batteryRealtime) {
14111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        NetworkStats.Entry entry = null;
14121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // Track UID data usage
14141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats uidStats = getNetworkStatsDetailGroupedByUid();
14151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final int size = uidStats.size();
14161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        for (int i = 0; i < size; i++) {
14171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            entry = uidStats.getValues(i, entry);
14181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final Uid u = mUidStats.get(entry.uid);
14201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (u == null) continue;
14211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14221059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            u.mStartedTcpBytesReceived = entry.rxBytes;
14231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            u.mStartedTcpBytesSent = entry.txBytes;
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14311059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14321059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // Track both mobile and total overall data
14331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats ifaceStats = getNetworkStatsSummary();
14341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry, mMobileIfaces);
14351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mMobileDataRx, entry.rxBytes);
14361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mMobileDataTx, entry.txBytes);
14371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry);
14381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mTotalDataRx, entry.rxBytes);
14391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mTotalDataTx, entry.txBytes);
14401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
14423f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataStart = getCurrentRadioDataUptime();
14433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = 0;
14441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
14463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = getCurrentBluetoothPingCount();
14473f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = 0;
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
14506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doPlugLocked(long batteryUptime, long batteryRealtime) {
14511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        NetworkStats.Entry entry = null;
14521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // Track both mobile and total overall data
14691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats ifaceStats = getNetworkStatsSummary();
14701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry, mMobileIfaces);
14711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mMobileDataRx, entry.rxBytes);
14721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mMobileDataTx, entry.txBytes);
14731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry);
14741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mTotalDataRx, entry.rxBytes);
14751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mTotalDataTx, entry.txBytes);
14761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
14783f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataUptime = getRadioDataUptime();
14793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
14803f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
14813f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
14823f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = getBluetoothPingCount();
14833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
14869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mWakeLockNesting;
14879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
14889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartWakeLocked(int uid, int pid, String name, int type) {
14891ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
14901ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // Only care about partial wake locks, since full wake locks
14911ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // will be canceled when the user puts the screen to sleep.
14921ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
14931ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG;
14941ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: "
14951ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
14961ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
14971ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
14981ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting++;
14999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
15010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
15020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
15030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
15040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type);
15069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
15089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopWakeLocked(int uid, int pid, String name, int type) {
15101ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
15111ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting--;
15121ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
15131ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG;
15141ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: "
15151ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
15161ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
15171ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
15189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
15200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
15210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
15220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
15230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type);
15259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
15279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
15297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
15307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
15317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStartWakeLocked(ws.get(i), pid, name, type);
15327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
15337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
15347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
15357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
15367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
15377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
15387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStopWakeLocked(ws.get(i), pid, name, type);
15397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
15407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
15417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
15420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public int startAddingCpuLocked() {
15430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler.removeMessages(MSG_UPDATE_WAKELOCKS);
15440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (mScreenOn) {
15460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
15470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
15500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (N == 0) {
15510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.clear();
15520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
15530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // How many timers should consume CPU?  Only want to include ones
15560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // that have already been in the list.
15570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
15580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
15590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (st.mInList) {
15600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = st.mUid;
15610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // We don't include the system UID, because it so often
15620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // holds wake locks at one request or another of an app.
15630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null && uid.mUid != Process.SYSTEM_UID) {
15640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    return 50;
15650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
15660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        return 0;
15700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
15710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void finishAddingCpuLocked(int perc, int utime, int stime, long[] cpuSpeedTimes) {
15730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
15740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (perc != 0) {
15750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            int num = 0;
15760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<N; i++) {
15770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                StopwatchTimer st = mPartialTimers.get(i);
15780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (st.mInList) {
15790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid uid = st.mUid;
15800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // We don't include the system UID, because it so often
15810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // holds wake locks at one request or another of an app.
15820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (uid != null && uid.mUid != Process.SYSTEM_UID) {
15830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        num++;
15840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
15850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
15860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (num != 0) {
15880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                for (int i=0; i<N; i++) {
15890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    StopwatchTimer st = mPartialTimers.get(i);
15900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (st.mInList) {
15910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        Uid uid = st.mUid;
15920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        if (uid != null && uid.mUid != Process.SYSTEM_UID) {
1593618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int myUTime = utime/num;
1594618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int mySTime = stime/num;
1595618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            utime -= myUTime;
1596618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            stime -= mySTime;
1597618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            num--;
15980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*");
15990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addCpuTimeLocked(myUTime, mySTime);
16000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addSpeedStepTimes(cpuSpeedTimes);
16010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        }
16020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
16030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
16040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            // Just in case, collect any lost CPU time.
16070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (utime != 0 || stime != 0) {
16080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = getUidStatsLocked(Process.SYSTEM_UID);
16090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null) {
16100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid.Proc proc = uid.getProcessStatsLocked("*lost*");
16110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addCpuTimeLocked(utime, stime);
16120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addSpeedStepTimes(cpuSpeedTimes);
16130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
16140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int NL = mLastPartialTimers.size();
16180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean diff = N != NL;
16190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL && !diff; i++) {
16200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i);
16210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (!diff) {
16230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<NL; i++) {
16240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mPartialTimers.get(i).mInList = true;
16250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return;
16270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL; i++) {
16300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.get(i).mInList = false;
16310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mLastPartialTimers.clear();
16330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
16340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
16350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            st.mInList = true;
16360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.add(st);
16370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
16390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteProcessDiedLocked(int uid, int pid) {
16419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.mPids.remove(pid);
16449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public long getProcessWakeTime(int uid, int pid, long realtime) {
16489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Uid.Pid p = u.mPids.get(pid);
16519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
16529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return p.mWakeSum + (p.mWakeStart != 0 ? (realtime - p.mWakeStart) : 0);
16539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
16549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return 0;
16569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) {
16599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.reportExcessiveWakeLocked(proc, overTime, usedTime);
16629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1665287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) {
1666287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        Uid u = mUidStats.get(uid);
1667287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        if (u != null) {
1668287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            u.reportExcessiveCpuLocked(proc, overTime, usedTime);
1669287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
1670287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    }
1671287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
16729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mSensorNesting;
16739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartSensorLocked(int uid, int sensor) {
16759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
16769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG;
16779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: "
16789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting++;
16829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStartSensor(sensor);
16839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopSensorLocked(int uid, int sensor) {
16869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting--;
16879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
16889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG;
16899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: "
16909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStopSensor(sensor);
16949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
169632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mGpsNesting;
16975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
16986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStartGpsLocked(int uid) {
169932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
17006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG;
170132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: "
170232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
170432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
170532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting++;
17062e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStartGps();
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStopGpsLocked(int uid) {
171032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting--;
171132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
17126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG;
171332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: "
171432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
171632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
17172e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStopGps();
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
17226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG;
172332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: "
172432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
1728617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1729617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this);
1730617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
17319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
17329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // Fake a wake lock, so we consider the device waked as long
17339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // as the screen is on.
17341ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1735c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
1736c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            // Update discharge amounts.
1737c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBatteryInternal) {
173832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                updateDischargeScreenLevelsLocked(false, true);
1739c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
17456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG;
174632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: "
174732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
1751617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1752617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1753617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
17549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
17551ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1756c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
1757c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            // Update discharge amounts.
1758c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBatteryInternal) {
175932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                updateDischargeScreenLevelsLocked(true, false);
1760c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
1761617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1762617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1764617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightnessLocked(int brightness) {
1765617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Bin the brightness.
1766617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
1767617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (bin < 0) bin = 0;
1768617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
1769617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mScreenBrightnessBin != bin) {
17706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK)
17716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT);
177232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: "
177332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1775617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenOn) {
1776617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (mScreenBrightnessBin >= 0) {
1777617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1778617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1779617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[bin].startRunningLocked(this);
1780617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1781617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessBin = bin;
1782617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1783617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17854cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate    public void noteInputEventAtomic() {
17864cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        mInputEventCounter.stepAtomic();
1787617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1789617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivityLocked(int uid, int event) {
17902e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteUserActivityLocked(event);
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
17953bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG;
179632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: "
179732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
18063bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG;
180732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: "
180832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
181432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
18153bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void stopAllSignalStrengthTimersLocked(int except) {
18165284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
18173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (i == except) {
18183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                continue;
18193bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
18203bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) {
18213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalStrengthsTimer[i].stopRunningLocked(this);
18223bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
18233bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
18243bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
18253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1826e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int fixPhoneServiceState(int state, int signalBin) {
1827e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (mPhoneSimStateRaw == TelephonyManager.SIM_STATE_ABSENT) {
1828e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // In this case we will always be STATE_OUT_OF_SERVICE, so need
1829e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // to infer that we are scanning from other data.
1830e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (state == ServiceState.STATE_OUT_OF_SERVICE
18315284090631e638b916d9a453212e9dc802656a67Wink Saville                    && signalBin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
1832e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                state = ServiceState.STATE_IN_SERVICE;
1833e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1834e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1835e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1836e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return state;
1837e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
1838e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1839e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private void updateAllPhoneStateLocked(int state, int simState, int bin) {
18403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        boolean scanning = false;
1841e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        boolean newHistory = false;
18423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1843e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneServiceStateRaw = state;
1844e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneSimStateRaw = simState;
1845e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneSignalStrengthBinRaw = bin;
1846e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1847e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (simState == TelephonyManager.SIM_STATE_ABSENT) {
1848e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // In this case we will always be STATE_OUT_OF_SERVICE, so need
1849e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // to infer that we are scanning from other data.
1850e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (state == ServiceState.STATE_OUT_OF_SERVICE
18515284090631e638b916d9a453212e9dc802656a67Wink Saville                    && bin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
1852e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                state = ServiceState.STATE_IN_SERVICE;
1853e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1854e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
18553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
18563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If the phone is powered off, stop all timers.
18573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (state == ServiceState.STATE_POWER_OFF) {
1858e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            bin = -1;
1859f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1860e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        // If we are in service, make sure the correct signal string timer is running.
1861e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else if (state == ServiceState.STATE_IN_SERVICE) {
1862e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // Bin will be changed below.
18633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
18643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If we're out of service, we are in the lowest signal strength
18653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // bin and have the scanning bit set.
1866f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        } else if (state == ServiceState.STATE_OUT_OF_SERVICE) {
18673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            scanning = true;
18685284090631e638b916d9a453212e9dc802656a67Wink Saville            bin = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1869f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalScanningTimer.isRunningLocked()) {
18706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG;
1871e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
18726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: "
18736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1874f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalScanningTimer.startRunningLocked(this);
1875f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1876f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
18775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
18783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (!scanning) {
18793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            // If we are no longer scanning, then stop the scanning timer.
18803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (mPhoneSignalScanningTimer.isRunningLocked()) {
18813bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG;
18823bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: "
18833bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1884e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
18853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalScanningTimer.stopRunningLocked(this);
18863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
18873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
18883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
188932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mPhoneServiceState != state) {
18906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK)
18916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (state << HistoryItem.STATE_PHONE_STATE_SHIFT);
1892e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + state + " to: "
189332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
1894e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            newHistory = true;
189532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mPhoneServiceState = state;
189632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
1897e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1898e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
1899e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
1900e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
1901e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1902e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (bin >= 0) {
1903e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) {
1904e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1905e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                }
1906e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_SIGNAL_STRENGTH_MASK)
1907e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        | (bin << HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT);
1908e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: "
1909e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1910e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
1911e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            } else {
1912e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                stopAllSignalStrengthTimersLocked(-1);
1913e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1914e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mPhoneSignalStrengthBin = bin;
1915e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1916e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1917e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (newHistory) {
1918e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1919e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1920e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
1921e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1922e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    /**
1923e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * Telephony stack updates the phone state.
1924e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * @param state phone state from ServiceState.getState()
1925e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     */
1926e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    public void notePhoneStateLocked(int state, int simState) {
1927e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        updateAllPhoneStateLocked(state, simState, mPhoneSignalStrengthBinRaw);
192832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
192932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1930e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
1931627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
19325284090631e638b916d9a453212e9dc802656a67Wink Saville        int bin = signalStrength.getLevel();
1933e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        updateAllPhoneStateLocked(mPhoneServiceStateRaw, mPhoneSimStateRaw, bin);
1934627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
19355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1936627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
1937627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
1938627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
1939627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
1940627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
1941627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
1942627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1943627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
1944627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
1945627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1946627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
1947627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
1948627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
19496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_CDMA:
19506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_CDMA;
19516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_0:
19536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_0;
19546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_A:
19566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_A;
19576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_1xRTT:
19596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_1xRTT;
19606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSDPA:
19626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSDPA;
19636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSUPA:
19656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSUPA;
19666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSPA:
19686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSPA;
19696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_IDEN:
19716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_IDEN;
19726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_B:
19746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_B;
19756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
1976962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                case TelephonyManager.NETWORK_TYPE_LTE:
1977962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    bin = DATA_CONNECTION_LTE;
1978962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    break;
1979962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                case TelephonyManager.NETWORK_TYPE_EHRPD:
1980962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    bin = DATA_CONNECTION_EHRPD;
1981962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    break;
1982627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
1983627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
1984627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1985627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1986627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
19873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData);
1988627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
19896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK)
19906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT);
199132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: "
199232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1994627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
1995627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
1996627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1997627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
1998627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
1999627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2000627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
20015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
200258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOnLocked() {
2003105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
20046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG;
200532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: "
200632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2008105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
2009105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
2010105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2011105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
20125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
201358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOffLocked() {
2014105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
20156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG;
201632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: "
201732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2019105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
2020105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
2021105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2022617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid >= 0) {
202358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked();
2024617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = -1;
2025617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2026105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2027244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2028244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOnLocked(int uid) {
2029244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mAudioOn) {
20306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG;
203132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: "
203232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2034244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = true;
2035244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.startRunningLocked(this);
2036244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20372e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOnLocked();
2038244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
20395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2040244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOffLocked(int uid) {
2041244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mAudioOn) {
20426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG;
204332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: "
204432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2046244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = false;
2047244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.stopRunningLocked(this);
2048244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20492e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOffLocked();
2050244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
2051244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2052244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOnLocked(int uid) {
2053244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mVideoOn) {
20546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG;
205532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: "
205632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2058244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = true;
2059244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.startRunningLocked(this);
2060244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20612e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOnLocked();
2062244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
20635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2064244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOffLocked(int uid) {
2065244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mVideoOn) {
20666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG;
206732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: "
206832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2070244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = false;
2071244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.stopRunningLocked(this);
2072244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20732e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOffLocked();
2074244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
2075244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
207658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningLocked(WorkSource ws) {
207758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (!mGlobalWifiRunning) {
20786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG;
207932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: "
208032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
208258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = true;
208358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.startRunningLocked(this);
208458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
208558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
208658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiRunningLocked();
208758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
208858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
208958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running");
2090d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
2091d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2092d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
209358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) {
209458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
209558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = oldWs.size();
209658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
209758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked();
209858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
209958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            N = newWs.size();
210058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
210158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked();
210258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
210358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
210458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running");
210558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
210658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
210758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
210858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStoppedLocked(WorkSource ws) {
210958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
21106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RUNNING_FLAG;
211132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: "
211232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
211458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = false;
211558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.stopRunningLocked(this);
211658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
211758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
211858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked();
211958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
212058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
212158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running");
2122d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
2123d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2124d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2125105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
2126105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
21276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG;
212832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: "
212932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2131105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
2132105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
2133105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2134105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
21355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2136105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
2137105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
21386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG;
213932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: "
214032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2142105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
2143105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
2144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2145105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
21465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
214732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiFullLockNesting = 0;
21485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2149105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
215032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
21516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
215232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: "
215332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
215532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
215632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting++;
21572e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked();
2158105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2159105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2160105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
216132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting--;
216232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
21636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
216432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: "
216532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
216732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
21682e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockReleasedLocked();
2169105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2170105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
217132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiScanLockNesting = 0;
21725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2173105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
217432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
21756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
217632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: "
217732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
217932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
218032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting++;
21812e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked();
2182105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2183105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2184105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
218532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting--;
218632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
21876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
218832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: "
218932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
219132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
21922e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockReleasedLocked();
2193105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
21945347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
219532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiMulticastNesting = 0;
21965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
21975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabledLocked(int uid) {
219832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
21996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
220032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: "
220132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
22026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
220332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
220432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting++;
22052e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastEnabledLocked();
22065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
22075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
22085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabledLocked(int uid) {
220932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting--;
221032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
22116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
221232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: "
221332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
22146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
221532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
22162e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastDisabledLocked();
22175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
22185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
22197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) {
22207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockAcquiredLocked(ws.get(i));
22237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) {
22277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockReleasedLocked(ws.get(i));
22307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteScanWifiLockAcquiredFromSourceLocked(WorkSource ws) {
22347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteScanWifiLockAcquiredLocked(ws.get(i));
22377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteScanWifiLockReleasedFromSourceLocked(WorkSource ws) {
22417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteScanWifiLockReleasedLocked(ws.get(i));
22447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) {
22487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastEnabledLocked(ws.get(i));
22517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) {
22557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastDisabledLocked(ws.get(i));
22587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22611059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    public void noteNetworkInterfaceTypeLocked(String iface, int networkType) {
22621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        if (ConnectivityManager.isNetworkTypeMobile(networkType)) {
22631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            mMobileIfaces.add(iface);
22641059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } else {
22651059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            mMobileIfaces.remove(iface);
22661059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
22671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
22681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
2270c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which);
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public long getScreenBrightnessTime(int brightnessBin,
2274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which) {
2275c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
2276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                batteryRealtime, which);
2277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
2278244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getInputEventCount(int which) {
2280c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mInputEventCounter.getCountLocked(which);
2281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
22825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
2284c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which);
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2286244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2287627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
2288627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2289c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
2290627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2291627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
2292f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2293f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    @Override public long getPhoneSignalScanningTime(
2294f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            long batteryRealtime, int which) {
2295f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        return mPhoneSignalScanningTimer.getTotalTimeLocked(
2296f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                batteryRealtime, which);
2297f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
2298f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneSignalStrengthCount(int dataType, int which) {
2300c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
23025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2303627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
2304627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2305c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
2306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
23085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2309617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneDataConnectionCount(int dataType, int which) {
2310c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2311617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
23125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
2314c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which);
2315105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
23165a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
231758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) {
231858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2319d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2320d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2321105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
2322c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which);
2323105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
23245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
23375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
23455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
23505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
235158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        boolean mWifiRunning;
235258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        StopwatchTimer mWifiRunningTimer;
23535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2354105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
2355c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mFullWifiLockTimer;
23565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2357105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
2358c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mScanWifiLockTimer;
23595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        boolean mWifiMulticastEnabled;
23615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        StopwatchTimer mWifiMulticastTimer;
23625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2363244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mAudioTurnedOn;
2364244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mAudioTurnedOnTimer;
23655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2366244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mVideoTurnedOn;
2367244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mVideoTurnedOnTimer;
23685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
2369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter[] mUserActivityCounters;
23705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
23905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        /**
23929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The transient wake stats we have collected for this uid's pids.
23939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         */
23949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        final SparseArray<Pid> mPids = new SparseArray<Pid>();
23959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
239858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
239958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimers, mUnpluggables);
24000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
240158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mFullWifiLockTimers, mUnpluggables);
24020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
240358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mScanWifiLockTimers, mUnpluggables);
24040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
240558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiMulticastTimers, mUnpluggables);
24060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
24070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables);
24080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
24095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables);
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2431eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2432eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2436eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2437eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
24436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
24456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
24531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final long uidRxBytes = getNetworkStatsDetailGroupedByUid().getTotal(
24541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    null, mUid).rxBytes;
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
24561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    ? (uidRxBytes - mStartedTcpBytesReceived) : 0);
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2458eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2459eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
24656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
24676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2474105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
247558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiRunningLocked() {
247658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (!mWifiRunning) {
247758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = true;
247858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer == null) {
247958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
248058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiRunningTimers, mUnpluggables);
24816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
248258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this);
2483617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2484617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
24855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2486617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
248758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiStoppedLocked() {
248858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunning) {
248958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = false;
249058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this);
2491617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2492617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
24935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2494617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2495105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
2496105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
2497105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
24986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer == null) {
24990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
250058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mFullWifiLockTimers, mUnpluggables);
25016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
2502105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
2503105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2504105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2506105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2507105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
2508105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
2509105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
2510105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
2511105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2512105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2514105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2515105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
2516105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
2517105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
25186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mScanWifiLockTimer == null) {
25190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
252058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mScanWifiLockTimers, mUnpluggables);
25216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
2522105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
2523105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2524105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2526105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2527105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
2528105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
2529105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
2530105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
2531105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
25355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastEnabledLocked() {
25365347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (!mWifiMulticastEnabled) {
25375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = true;
25386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer == null) {
25390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
254058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiMulticastTimers, mUnpluggables);
25416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this);
25435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
25445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
25455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
25475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastDisabledLocked() {
25485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (mWifiMulticastEnabled) {
25495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = false;
25505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this);
25515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
25525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
25535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOnLocked() {
25566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mAudioTurnedOn) {
25576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = true;
25586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer == null) {
25590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
25606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
25616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
25636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2564617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2565244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
25666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOffLocked() {
25686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOn) {
25696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = false;
25706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
25716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
25736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOnLocked() {
25766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mVideoTurnedOn) {
25776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = true;
25786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer == null) {
25790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
25806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
25816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
25836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
25856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOffLocked() {
25886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOn) {
25896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = false;
25906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
25916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2592244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2593244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
25945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
259558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public long getWifiRunningTime(long batteryRealtime, int which) {
259658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer == null) {
25976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
25986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
259958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2600244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2601244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
26025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
2603105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
26046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer == null) {
26056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
2608105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
26095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
26105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
2611105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
26126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer == null) {
26136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
2616105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
26175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
26185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
26195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public long getWifiMulticastTime(long batteryRealtime, int which) {
26206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer == null) {
26216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime,
26245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                          which);
26255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
26265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
26275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
26286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getAudioTurnedOnTime(long batteryRealtime, int which) {
26296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer == null) {
26306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
26336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
26346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
26355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
26366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getVideoTurnedOnTime(long batteryRealtime, int which) {
26376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer == null) {
26386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
26416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
26426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
2643617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2644617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteUserActivityLocked(int type) {
2645617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2646617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                initUserActivityLocked();
2647617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2648617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (type < 0) type = 0;
2649617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1;
26504cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUserActivityCounters[type].stepAtomic();
2651617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2653617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2654617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
2655617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
2656617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26575a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2658617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2659617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
2660617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2661617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
2662617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
2664617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2666617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
2667617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2668617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2669617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
2670617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2671617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
26741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final long uidTxBytes = getNetworkStatsDetailGroupedByUid().getTotal(
26751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    null, mUid).txBytes;
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
26771059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    ? (uidTxBytes - mStartedTcpBytesSent) : 0);
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2679244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
26806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
26816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear all stats for this uid.  Returns true if the uid is completely
26826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * inactive so can be dropped.
26836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
26846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        boolean reset() {
26856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean active = false;
26865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
268758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
268858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false);
268958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= mWifiRunning;
26906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
26929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false);
26936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mFullWifiLockOut;
26946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer != null) {
26969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mScanWifiLockTimer.reset(BatteryStatsImpl.this, false);
26976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mScanWifiLockOut;
26986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
27009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false);
27016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mWifiMulticastEnabled;
27026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
27049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false);
27056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mAudioTurnedOn;
27066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
27089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false);
27096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mVideoTurnedOn;
27106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0;
27136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0;
27145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
27166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
27176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUserActivityCounters[i].reset(false);
27186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
27216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWakelockStats.size() > 0) {
27226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator();
27236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Wakelock> wakelockEntry = it.next();
27256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Wakelock wl = wakelockEntry.getValue();
27266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (wl.reset()) {
27276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
27286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
27296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
27306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mSensorStats.size() > 0) {
27346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator();
27356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<Integer, Sensor> sensorEntry = it.next();
27376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Sensor s = sensorEntry.getValue();
27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (s.reset()) {
27396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
27406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
27416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
27426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mProcessStats.size() > 0) {
27466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator();
27476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Proc> procEntry = it.next();
27496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    procEntry.getValue().detach();
27506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mProcessStats.clear();
27526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mPids.size() > 0) {
27549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; !active && i<mPids.size(); i++) {
27559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    Pid pid = mPids.valueAt(i);
27569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    if (pid.mWakeStart != 0) {
27579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        active = true;
27589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    }
27599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
27609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
27616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mPackageStats.size() > 0) {
27626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator();
27636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Pkg> pkgEntry = it.next();
27656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Pkg p = pkgEntry.getValue();
27666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    p.detach();
27676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (p.mServiceStats.size() > 0) {
27686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        Iterator<Map.Entry<String, Pkg.Serv>> it2
27696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                                = p.mServiceStats.entrySet().iterator();
27706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        while (it2.hasNext()) {
27716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            Map.Entry<String, Pkg.Serv> servEntry = it2.next();
27726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            servEntry.getValue().detach();
27736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
27746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mPackageStats.clear();
27776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPids.clear();
27809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
27816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!active) {
278258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer != null) {
278358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer.detach();
27846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer != null) {
27866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mFullWifiLockTimer.detach();
27876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mScanWifiLockTimer != null) {
27896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mScanWifiLockTimer.detach();
27906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer != null) {
27926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mWifiMulticastTimer.detach();
27936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer != null) {
27956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mAudioTurnedOnTimer.detach();
27966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer != null) {
27986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mVideoTurnedOnTimer.detach();
27996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mUserActivityCounters != null) {
28016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
28026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUserActivityCounters[i].detach();
28036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
28046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return !active;
28086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
28095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
284558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
28466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
284758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.writeToParcel(out, batteryRealtime);
28486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
2849617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
28506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
28526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
2854617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
28556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer != null) {
28586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
28606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
28646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer.writeToParcel(out, batteryRealtime);
28666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
28706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime);
28726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
28766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime);
28786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
2882617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
2883617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2884617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
2885617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
28866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
2888617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
28989e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) {
28999e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // We will just drop some random set of wakelocks if
29009e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // the previous run of the system was an older version
29019e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // that didn't impose a limit.
29029e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(wakelockName, wakelock);
29039e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
293958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunning = false;
29406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
294158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
294258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiRunningTimers, mUnpluggables, in);
29436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
294458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = null;
29456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2946105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
29476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
294958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mFullWifiLockTimers, mUnpluggables, in);
29506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer = null;
29526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2953105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
29546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
295658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mScanWifiLockTimers, mUnpluggables, in);
29576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mScanWifiLockTimer = null;
29596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastEnabled = false;
29616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
296358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiMulticastTimers, mUnpluggables, in);
2964617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
29656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer = null;
29666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mAudioTurnedOn = false;
29686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
29706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
29716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer = null;
29736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mVideoTurnedOn = false;
29756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
29776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
29786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer = null;
29806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
2982617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2983617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2984617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
2985617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
29866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUserActivityCounters = null;
2988617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2998c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3003c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3008c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3017c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, type, pool, unpluggables, in);
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
30276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                boolean wlactive = false;
30286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerFull != null) {
30299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false);
30306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerPartial != null) {
30329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false);
30336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerWindow != null) {
30359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false);
30366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (!wlactive) {
30386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerFull != null) {
30396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull.detach();
30406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull = null;
30416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerPartial != null) {
30436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial.detach();
30446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial = null;
30456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerWindow != null) {
30476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow.detach();
30486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow = null;
30496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return !wlactive;
30526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
3082c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
30835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3088c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3094c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
3096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in);
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
31039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (mTimer.reset(BatteryStatsImpl.this, true)) {
31046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mTimer = null;
31056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return true;
31066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
31076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return false;
31086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
31095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3122eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3123eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3149eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Amount of time the process was running in the foreground.
3150eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3151eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mForegroundTime;
3152eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3153eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3169eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from a previous save.
3170eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3171eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLoadedForegroundTime;
3172eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3173eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3189eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from the previous run
3190eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3191eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLastForegroundTime;
3192eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3193eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3208eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
3209eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time since unplugged.
3210eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3211eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mUnpluggedForegroundTime;
3212eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3213e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            SamplingCounter[] mSpeedBins;
3214e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3215287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            ArrayList<ExcessivePower> mExcessivePower;
32169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
3219e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[getCpuSpeedSteps()];
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3221e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
3226eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = mForegroundTime;
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
32326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
32336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
32346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i = 0; i < mSpeedBins.length; i++) {
32356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
32366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
32376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUnpluggables.remove(c);
32386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = null;
32396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
32406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
32416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
32425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3243287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public int countExcessivePowers() {
3244287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                return mExcessivePower != null ? mExcessivePower.size() : 0;
32459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3247287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public ExcessivePower getExcessivePower(int i) {
3248287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower != null) {
3249287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    return mExcessivePower.get(i);
32509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return null;
32529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            public void addExcessiveWake(long overTime, long usedTime) {
3255287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3256287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
32579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
3258287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3259287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_WAKE;
32609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.overTime = overTime;
32619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.usedTime = usedTime;
3262287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
32639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3265287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public void addExcessiveCpu(long overTime, long usedTime) {
3266287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3267287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
3268287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                }
3269287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3270287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_CPU;
3271287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.overTime = overTime;
3272287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.usedTime = usedTime;
3273287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
3274287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
3275287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
3276287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            void writeExcessivePowerToParcelLocked(Parcel out) {
3277287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
32789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeInt(0);
32799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    return;
32809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3282287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                final int N = mExcessivePower.size();
32839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                out.writeInt(N);
32849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3285287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = mExcessivePower.get(i);
3286287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    out.writeInt(ew.type);
32879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.overTime);
32889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.usedTime);
32899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32927b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            boolean readExcessivePowerFromParcelLocked(Parcel in) {
32939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                final int N = in.readInt();
32949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (N == 0) {
3295287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = null;
32967b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return true;
32979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32997b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (N > 10000) {
33007b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many excessive power entries " + N);
33017b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return false;
33027b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
33037b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn
3304287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower = new ArrayList<ExcessivePower>();
33059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3306287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = new ExcessivePower();
3307287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ew.type = in.readInt();
33089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.overTime = in.readLong();
33099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.usedTime = in.readLong();
3310287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower.add(ew);
33119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33127b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                return true;
33139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
33149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
3318eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mForegroundTime);
33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
3322eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLoadedForegroundTime);
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
3326eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mUnpluggedForegroundTime);
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
3328e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3329e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                out.writeInt(mSpeedBins.length);
3330e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
33316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
33326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
33336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(1);
33346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.writeToParcel(out);
33356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
33366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(0);
33376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3338e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
33399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3340287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                writeExcessivePowerToParcelLocked(out);
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
3346eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime = in.readLong();
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
3350eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLoadedForegroundTime = in.readLong();
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
33523bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastUserTime = 0;
33533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastSystemTime = 0;
33543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastForegroundTime = 0;
33553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastStarts = 0;
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
3358eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = in.readLong();
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
3360e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3361e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                int bins = in.readInt();
33626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                int steps = getCpuSpeedSteps();
33636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps];
3364e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < bins; i++) {
33656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (in.readInt() != 0) {
33666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = new SamplingCounter(mUnpluggables, in);
33676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3368e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
33699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3370287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                readExcessivePowerFromParcelLocked(in);
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3382eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public void addForegroundTimeLocked(long ttime) {
3383eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime += ttime;
3384eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3385eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
33996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
34156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
3423eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public long getForegroundTime(int which) {
3424eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                long val;
3425eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                if (which == STATS_LAST) {
3426eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mLastForegroundTime;
3427eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                } else {
3428eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mForegroundTime;
3429eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    if (which == STATS_CURRENT) {
3430eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mLoadedForegroundTime;
34316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
3432eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mUnpluggedForegroundTime;
3433eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    }
3434eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                }
3435eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                return val;
3436eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3437eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3438eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
34476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3453e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3454e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /* Called by ActivityManagerService when CPU times are updated. */
3455e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public void addSpeedStepTimes(long[] values) {
3456e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length && i < values.length; i++) {
34576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    long amt = values[i];
34586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (amt != 0) {
34596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        SamplingCounter c = mSpeedBins[i];
34606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        if (c == null) {
34616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            mSpeedBins[i] = c = new SamplingCounter(mUnpluggables);
34626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
34636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.addCountAtomic(values[i]);
34646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3465e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3466e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
3467e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3468e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            @Override
3469e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public long getTimeAtCpuSpeedStep(int speedStep, int which) {
3470e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                if (speedStep < mSpeedBins.length) {
34716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[speedStep];
34726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return c != null ? c.getCountLocked(which) : 0;
3473e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                } else {
3474e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return 0;
3475e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3476e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
35246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
35256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
35265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
35303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastWakeups = 0;
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
35726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
36876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                void detach() {
36886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUnpluggables.remove(this);
36896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
36905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
37033bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStartTime = 0;
37043bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStarts = 0;
37053bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastLaunches = 0;
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
37926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
38096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
38266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3862b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        public SparseArray<? extends Pid> getPidStats() {
3863b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            return mPids;
3864b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        }
38655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
38669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public Pid getPidStatsLocked(int pid) {
38679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Pid p = mPids.get(pid);
38689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p == null) {
38699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p = new Pid();
38709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mPids.put(pid, p);
38719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
38729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return p;
38739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
38749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3904c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
39079e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) {
39089e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    name = BATCHED_WAKELOCK_NAME;
39099e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = mWakelockStats.get(name);
39109e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
39119e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (wl == null) {
39129e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = new Wakelock();
39139e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(name, wl);
39149e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3916c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL,
39220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mPartialTimers, mUnpluggables);
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL,
39300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mFullTimers, mUnpluggables);
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW,
39380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mWindowTimers, mUnpluggables);
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3947c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3956c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3960c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
3962c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables);
39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStartWakeLocked(int pid, String name, int type) {
3971c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39751ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
39769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = getPidStatsLocked(pid);
3977b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p.mWakeStart == 0) {
3978b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                    p.mWakeStart = SystemClock.elapsedRealtime();
3979b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                }
39809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStopWakeLocked(int pid, String name, int type) {
3984c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39881ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
39899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = mPids.get(pid);
3990b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p != null && p.mWakeStart != 0) {
39919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart;
39929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeStart = 0;
39939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
39949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
39959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
39969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
39979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) {
39989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Proc p = getProcessStatsLocked(proc);
39999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
40009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p.addExcessiveWake(overTime, usedTime);
40019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4004287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) {
4005287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            Proc p = getProcessStatsLocked(proc);
4006287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            if (p != null) {
4007287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                p.addExcessiveCpu(overTime, usedTime);
4008287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
4009287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
4010287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
4012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
4020c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
40235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
4027c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
4034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
4037244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
40461afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = new JournaledFile(new File(filename), new File(filename + ".tmp"));
40470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = new MyHandler();
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
40490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables);
4050617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
40510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables);
4052617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4053617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
40540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables);
40555284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
40560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables);
4057627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
40580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables);
4059627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
40600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables);
4061627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
40620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables);
406358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables);
40640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables);
40650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables);
40660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables);
40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
40686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
4075633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
40766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = 0;
4077633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
4078c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
40790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
40831afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
40840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
40850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void setCallback(BatteryCallback cb) {
40900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mCallback = cb;
40910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
40920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
4093e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public void setNumSpeedSteps(int steps) {
4094e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (sNumSpeedSteps == 0) sNumSpeedSteps = steps;
4095e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4096e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4097f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void setRadioScanningTimeout(long timeout) {
4098f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneSignalScanningTimer != null) {
4099f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.setTimeout(timeout);
4100f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
4101f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
4102f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
41030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingOldHistoryLocked() {
41050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
41060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
41070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
41081fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        mHistoryReadTmp.clear();
41090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
41100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
4111ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return (mHistoryIterator = mHistory) != null;
4112ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4113ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
41140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextOldHistoryLocked(HistoryItem out) {
41160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize();
41170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!end) {
41181fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mHistoryReadTmp.readDelta(mHistoryBuffer);
41191fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW;
41200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4121ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        HistoryItem cur = mHistoryIterator;
4122ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (cur == null) {
41230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (!mReadOverflow && !end) {
41240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "Old history ends before new history!");
41250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
4126ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return false;
4127ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4128ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        out.setTo(cur);
4129ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mHistoryIterator = cur.next;
41300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!mReadOverflow) {
41310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (end) {
41320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "New history ends before old history!");
41331fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else if (!out.same(mHistoryReadTmp)) {
41340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
41350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                PrintWriter pw = new PrintWriter(new LogWriter(android.util.Log.WARN, TAG));
41360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Histories differ!");
41370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Old history:");
41380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, out, now);
41390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("New history:");
41401fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, now);
41410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
41420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4143ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return true;
4144ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4145ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
41470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingOldHistoryLocked() {
41480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
41490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
41500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingHistoryLocked() {
41540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
41550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
41560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
41570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
41580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
41590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return mHistoryBuffer.dataSize() > 0;
41600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextHistoryLocked(HistoryItem out) {
41641fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        final int pos = mHistoryBuffer.dataPosition();
41651fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        if (pos == 0) {
41661fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            out.clear();
41671fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        }
41681fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        boolean end = pos >= mHistoryBuffer.dataSize();
41690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (end) {
41700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return false;
41710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
41720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41731fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        out.readDelta(mHistoryBuffer);
41740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return true;
41750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingHistoryLocked() {
41790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
41800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
418132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
41825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
418332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    @Override
4184b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    public long getHistoryBaseTime() {
4185b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        return mHistoryBaseTime;
4186b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    }
41875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4188b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    @Override
41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public boolean isScreenOn() {
41989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return mScreenOn;
41999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
42009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
42016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void initTimes() {
42026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryRealtime = mTrackBatteryPastUptime = 0;
42036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryUptime = mTrackBatteryPastRealtime = 0;
42046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
42056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
42066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
42076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
42086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
42095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4210c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    void initDischarge() {
4211c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mLowDischargeAmountSinceCharge = 0;
4212c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mHighDischargeAmountSinceCharge = 0;
4213c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = 0;
4214c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = 0;
4215c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = 0;
4216c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = 0;
4217c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4218c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
42196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void resetAllStatsLocked() {
42206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mStartCount = 0;
42216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
42229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mScreenOnTimer.reset(this, false);
42236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
42249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mScreenBrightnessTimer[i].reset(this, false);
42256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mInputEventCounter.reset(false);
42279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneOnTimer.reset(this, false);
42289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mAudioOnTimer.reset(this, false);
42299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mVideoOnTimer.reset(this, false);
42305284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
42319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneSignalStrengthsTimer[i].reset(this, false);
42326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneSignalScanningTimer.reset(this, false);
42346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
42359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneDataConnectionsTimer[i].reset(this, false);
42366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mWifiOnTimer.reset(this, false);
423858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.reset(this, false);
42399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mBluetoothOnTimer.reset(this, false);
42405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<mUidStats.size(); i++) {
42426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUidStats.valueAt(i).reset()) {
42436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUidStats.remove(mUidStats.keyAt(i));
42446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                i--;
42456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
42466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mKernelWakelockStats.size() > 0) {
42496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            for (SamplingTimer timer : mKernelWakelockStats.values()) {
42506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(timer);
42516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
42526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mKernelWakelockStats.clear();
42536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4255c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
42565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        clearHistoryLocked();
42586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
42595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
426032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) {
4261c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (oldScreenOn) {
4262c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel;
4263c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4264c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOn += diff;
4265c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOnSinceCharge += diff;
4266c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4267c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4268c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel;
4269c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4270c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOff += diff;
4271c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOffSinceCharge += diff;
4272c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4273c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4274c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (newScreenOn) {
4275c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel;
4276c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = 0;
4277c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4278c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = 0;
4279c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel;
4280c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4281c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4282c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
42836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void setOnBattery(boolean onBattery, int oldStatus, int level) {
42849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
428532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            setOnBatteryLocked(onBattery, oldStatus, level);
428632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
428732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    }
428832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
428932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void setOnBatteryLocked(boolean onBattery, int oldStatus, int level) {
429032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        boolean doWrite = false;
429132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE);
429232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        m.arg1 = onBattery ? 1 : 0;
429332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mHandler.sendMessage(m);
429432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mOnBattery = mOnBatteryInternal = onBattery;
429532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
429632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long uptime = SystemClock.uptimeMillis() * 1000;
429732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long mSecRealtime = SystemClock.elapsedRealtime();
429832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long realtime = mSecRealtime * 1000;
429932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (onBattery) {
430032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // We will reset our status if we are unplugging after the
430132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // battery was last full, or the level is at 100, or
430232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // we have gone through a significant charge (from a very low
430332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // level to a now very high level).
430432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (oldStatus == BatteryManager.BATTERY_STATUS_FULL
430532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || level >= 90
430632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || (mDischargeCurrentLevel < 20 && level >= 80)) {
430732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                doWrite = true;
430832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                resetAllStatsLocked();
430932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeStartLevel = level;
431032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
431132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
431232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
431332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
431432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: "
431532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
431632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
431732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryUptimeStart = uptime;
431832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryRealtimeStart = realtime;
431932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
432032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
432132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = mDischargeUnplugLevel = level;
432232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mScreenOn) {
432332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = level;
432432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = 0;
43256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
432632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = 0;
432732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = level;
43286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
432932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOn = 0;
433032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOff = 0;
433132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
433232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        } else {
433332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
433432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
433532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
433632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: "
433732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
433832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
433932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
434032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
434132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = level;
434232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (level < mDischargeUnplugLevel) {
434332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;
434432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level;
434532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
434632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn);
434732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
434832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
434932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) {
435032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mFile != null) {
435132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                writeAsyncLocked();
43529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43555a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
43566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // This should probably be exposed in the API, though it's not critical
43576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    private static final int BATTERY_PLUGGED_NONE = 0;
43585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
43596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void setBatteryState(int status, int health, int plugType, int level,
43606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int temp, int volt) {
436132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        synchronized(this) {
436232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
436332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            int oldStatus = mHistoryCur.batteryStatus;
436432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!mHaveBatteryLevel) {
436532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHaveBatteryLevel = true;
436632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We start out assuming that the device is plugged in (not
436732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // on battery).  If our first report is now that we are indeed
436832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // plugged in, then twiddle our state to correctly reflect that
436932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // since we won't be going through the full setOnBattery().
437032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (onBattery == mOnBattery) {
437132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    if (onBattery) {
437232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
437332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    } else {
437432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
437532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    }
43766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
437732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                oldStatus = status;
43786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
437932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery) {
438032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeCurrentLevel = level;
438132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = true;
43826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
438332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery != mOnBattery) {
438432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHistoryCur.batteryLevel = (byte)level;
43856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryStatus = (byte)status;
43866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryHealth = (byte)health;
43876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryPlugType = (byte)plugType;
43886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryTemperature = (char)temp;
43896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryVoltage = (char)volt;
439032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                setOnBatteryLocked(onBattery, oldStatus, level);
439132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            } else {
439232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                boolean changed = false;
439332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryLevel != level) {
439432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryLevel = (byte)level;
439532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
439632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
439732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryStatus != status) {
439832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryStatus = (byte)status;
439932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
440032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
440132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryHealth != health) {
440232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryHealth = (byte)health;
440332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
440432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
440532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryPlugType != plugType) {
440632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryPlugType = (byte)plugType;
440732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
440832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
440932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (temp >= (mHistoryCur.batteryTemperature+10)
441032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || temp <= (mHistoryCur.batteryTemperature-10)) {
441132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryTemperature = (char)temp;
441232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
441332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
441432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (volt > (mHistoryCur.batteryVoltage+20)
441532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || volt < (mHistoryCur.batteryVoltage-20)) {
441632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryVoltage = (char)volt;
441732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
441832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
441932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (changed) {
442032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    addHistoryRecordLocked(SystemClock.elapsedRealtime());
442132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
44226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
442332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
442432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We don't record history while we are plugged in and fully charged.
442532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // The next time we are unplugged, history will be cleared.
442632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = false;
44276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
44286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4429633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
44305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4431c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
4432c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
44335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4434d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        if (m == null) {
4435d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            // Not crashing might make board bringup easier.
44361afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "Couldn't get kernel wake lock stats");
4437d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            return;
4438d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        }
4439d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen
4440c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
4441c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
4442c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
44435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4444c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
4445c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
44465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
4447c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
4448c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
4449c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4450c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
4451c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
4452c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
4453c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
44545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4455c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
4456c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
4457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
4458c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
4459c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
4460c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
4461c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
4462c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4463c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4464c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart);
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
44806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart);
44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
44916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
45009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
45019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
45029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
45039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
45049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
45056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
45206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
45229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
45309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
45329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45563718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long getTcpBytes(long current, long[] dataBytes, int which) {
45573718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (which == STATS_LAST) {
45583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return dataBytes[STATS_LAST];
45593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
45606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (which == STATS_SINCE_UNPLUGGED) {
45616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) {
45623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return dataBytes[STATS_LAST];
45633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                } else {
45646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return current - dataBytes[STATS_SINCE_UNPLUGGED];
45653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                }
45666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else if (which == STATS_SINCE_CHARGED) {
45676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED];
45683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            }
45693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return current - dataBytes[STATS_CURRENT];
45703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
45713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesSent(int which) {
45751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long mobileTxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).txBytes;
45761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(mobileTxBytes, mMobileDataTx, which);
45773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesReceived(int which) {
45811059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long mobileRxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).rxBytes;
45821059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(mobileRxBytes, mMobileDataRx, which);
45833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesSent(int which) {
45871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long totalTxBytes = getNetworkStatsSummary().getTotal(null).txBytes;
45881059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(totalTxBytes, mTotalDataTx, which);
45893718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45903718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45913718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45923718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesReceived(int which) {
45931059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long totalRxBytes = getNetworkStatsSummary().getTotal(null).rxBytes;
45941059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(totalRxBytes, mTotalDataRx, which);
45953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
4597105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4598633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
4599105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4600633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
4601105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4602105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4604633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
46056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mDischargeUnplugLevel;
4606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4608105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4609633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
4610105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4611633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
4612105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4613105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4615633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
4616e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return mDischargeCurrentLevel;
4617105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    @Override
46203bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getLowDischargeAmountSinceCharge() {
46213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4622e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mLowDischargeAmountSinceCharge;
4623e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4624e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel-1;
4625e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4626e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
46273bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
46283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
46293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
46303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
46313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getHighDischargeAmountSinceCharge() {
46323bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4633e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mHighDischargeAmountSinceCharge;
4634e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4635e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel;
4636e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4637e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
46383bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
46393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
4640c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4641c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOn() {
4642c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4643c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOn;
4644c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4645c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4646c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4647c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4648c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4649c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4650c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4651c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4652c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOnSinceCharge() {
4653c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4654c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOnSinceCharge;
4655c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4656c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4657c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4658c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4659c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4660c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4661c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4662c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4663c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOff() {
4664c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4665c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOff;
4666c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4667c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4668c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4669c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4670c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4671c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4672c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4673c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4674c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOffSinceCharge() {
4675c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4676c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOffSinceCharge;
4677c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4678c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4679c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4680c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4681c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4682c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4683c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
46843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
46853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
4686e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public int getCpuSpeedSteps() {
4687e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return sNumSpeedSteps;
4688e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4689e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
46909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
46929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
47009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
470832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
47119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
47169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
471932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * Retrieve the statistics object for a particular process, given
472032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * the name of the process.
472132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @param name process name
472232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @return the statistics object for the process
472332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     */
4724819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public Uid.Proc getProcessStatsLocked(String name, int pid) {
472532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        int uid;
472632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (mUidCache.containsKey(name)) {
472732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            uid = mUidCache.get(name);
472832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        } else {
4729819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani            uid = Process.getUidForPid(pid);
473032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            mUidCache.put(name, uid);
473132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
473232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        Uid u = getUidStatsLocked(uid);
473332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        return u.getProcessStatsLocked(name);
473432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
473532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
473632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    /**
47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
475458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    /**
475558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * Massage data to distribute any reasonable work down to more specific
475658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * owners.  Must only be called on a dead BatteryStats object!
475758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     */
475858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void distributeWorkLocked(int which) {
475958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        // Aggregate all CPU time associated with WIFI.
476058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        Uid wifiUid = mUidStats.get(Process.WIFI_UID);
476158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (wifiUid != null) {
476258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which);
476358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (Uid.Proc proc : wifiUid.mProcessStats.values()) {
476458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which);
476558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<mUidStats.size(); i++) {
476658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    Uid uid = mUidStats.valueAt(i);
476758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (uid.mUid != Process.WIFI_UID) {
476858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        long uidRunningTime = uid.getWifiRunningTime(uSecTime, which);
476958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (uidRunningTime > 0) {
477058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*");
477158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            long time = proc.getUserTime(which);
477258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
477358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mUserTime += time;
477458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mUserTime -= time;
477558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getSystemTime(which);
477658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
477758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mSystemTime += time;
477858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mSystemTime -= time;
477958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getForegroundTime(which);
478058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
478158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mForegroundTime += time;
478258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mForegroundTime -= time;
478358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            for (int sb=0; sb<proc.mSpeedBins.length; sb++) {
478458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                SamplingCounter sc = proc.mSpeedBins[sb];
478558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                if (sc != null) {
478658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = sc.getCountLocked(which);
478758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = (time*uidRunningTime)/totalRunningTime;
478858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    SamplingCounter uidSc = uidProc.mSpeedBins[sb];
478958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    if (uidSc == null) {
479058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidSc = new SamplingCounter(mUnpluggables);
479158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidProc.mSpeedBins[sb] = uidSc;
479258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    }
479358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    uidSc.mCount.addAndGet((int)time);
479458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    sc.mCount.addAndGet((int)-time);
479558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                }
479658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            }
479758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            totalRunningTime -= uidRunningTime;
479858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
479958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
480058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
480158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
480258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
480358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
480458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
48056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void shutdownLocked() {
4806ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSyncLocked();
48076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mShuttingDown = true;
48081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    }
48095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4810ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    Parcel mPendingWrite = null;
4811ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    final ReentrantLock mWriteLock = new ReentrantLock();
4812ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4813ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeAsyncLocked() {
4814ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(false);
4815ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4816ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4817ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeSyncLocked() {
4818ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(true);
4819ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4820ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4821ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    void writeLocked(boolean sync) {
48221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
48231afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "writeLocked: no file associated with this instance");
48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mShuttingDown) {
48286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
48296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
48305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4831ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        Parcel out = Parcel.obtain();
4832ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSummaryToParcel(out);
4833ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mLastWriteTime = SystemClock.elapsedRealtime();
4834ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4835ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mPendingWrite != null) {
4836ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite.recycle();
4837ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4838ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mPendingWrite = out;
4839ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4840ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (sync) {
4841ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            commitPendingDataToDisk();
4842ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } else {
4843ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            Thread thr = new Thread("BatteryStats-Write") {
4844ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                @Override
4845ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                public void run() {
4846ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4847ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    commitPendingDataToDisk();
4848ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                }
4849ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            };
4850ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            thr.start();
4851ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4852ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4853ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4854ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void commitPendingDataToDisk() {
4855f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        final Parcel next;
4856ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        synchronized (this) {
4857ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next = mPendingWrite;
4858ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite = null;
4859f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            if (next == null) {
4860f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                return;
4861f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            }
4862ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4863ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.lock();
4864ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4865ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
48669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
48671afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite());
4868ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            stream.write(next.marshall());
48699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
48708bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn            FileUtils.sync(stream);
48719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
48721afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            mFile.commit();
48739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
48741afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "Error writing battery statistics", e);
4875ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mFile.rollback();
4876ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } finally {
4877ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next.recycle();
4878ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.unlock();
48799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
48839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
48849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
48859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
48869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
48879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
48889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
48899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
48909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
48919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
48929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
48939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
48949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
48969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
48979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
48989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
48999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
49009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
49019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
49061afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
49071afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readLocked: no file associated with this instance");
49089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
49099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
49129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
49141afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            File file = mFile.chooseForRead();
49151afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (!file.exists()) {
49161afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
49179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49181afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileInputStream stream = new FileInputStream(file);
49199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
49259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
49281afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.e("BatteryStats", "Error reading battery statistics", e);
49299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long now = SystemClock.elapsedRealtime();
4932e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (USE_OLD_HISTORY) {
4933e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            addHistoryRecordLocked(now, HistoryItem.CMD_START);
4934e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
49350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(now, HistoryItem.CMD_START);
49369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
49399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4942ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    void readHistory(Parcel in, boolean andOldHistory) {
4943ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        final long historyBaseTime = in.readLong();
49440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
49450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataSize(0);
49460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
49470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
49480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int bufSize = in.readInt();
49490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int curPos = in.dataPosition();
49500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) {
49510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer too large " + bufSize);
49520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else if ((bufSize&~3) != bufSize) {
49530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer not aligned " + bufSize);
49540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else {
49550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (DEBUG_HISTORY) Slog.i(TAG, "***************** READING NEW HISTORY: " + bufSize
49560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    + " bytes at " + curPos);
49570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.appendFrom(in, curPos, bufSize);
49580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            in.setDataPosition(curPos + bufSize);
495932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
49605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4961ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (andOldHistory) {
4962ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            readOldHistory(in);
4963ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
4964ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
4965ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
4966ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
4967ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** OLD mHistoryBaseTime: ");
4968ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
4969ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
4970ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
4971ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        mHistoryBaseTime = historyBaseTime;
4972ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
4973ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
4974ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** NEW mHistoryBaseTime: ");
4975ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
4976ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
4977ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
4978ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
4979ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        // We are just arbitrarily going to insert 1 minute from the sample of
4980ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        // the last run until samples in this run.
4981ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (mHistoryBaseTime > 0) {
4982ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            long oldnow = SystemClock.elapsedRealtime();
4983ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            mHistoryBaseTime = (mHistoryBaseTime - oldnow) + 60*1000;
4984ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            if (DEBUG_HISTORY) {
4985ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                StringBuilder sb = new StringBuilder(128);
4986ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                sb.append("****************** ADJUSTED mHistoryBaseTime: ");
4987ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                TimeUtils.formatDuration(mHistoryBaseTime, sb);
4988ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                Slog.i(TAG, sb.toString());
4989ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            }
49901e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn        }
499132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
49925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void readOldHistory(Parcel in) {
4994e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
4995e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
4996e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
49970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistory = mHistoryEnd = mHistoryCache = null;
49980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long time;
49995e3357fcee2a23a08434873a89e8ada4c6e6d893Conley Owens        while (in.dataAvail() > 0 && (time=in.readLong()) >= 0) {
50000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            HistoryItem rec = new HistoryItem(time, in);
50010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            addHistoryRecordLocked(rec);
50020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
50030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
50040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
5005ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    void writeHistory(Parcel out, boolean andOldHistory) {
5006ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
5007ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
5008ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** WRITING mHistoryBaseTime: ");
5009ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
5010ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append(" mLastHistoryTime: ");
5011ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mLastHistoryTime, sb);
5012ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
5013ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5014ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        out.writeLong(mHistoryBaseTime + mLastHistoryTime);
50150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.writeInt(mHistoryBuffer.dataSize());
50160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: "
50170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition());
50180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize());
5019ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
5020ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (andOldHistory) {
5021ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            writeOldHistory(out);
5022ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
50230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
50240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
50250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void writeOldHistory(Parcel out) {
5026e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
5027e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
5028e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
50296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistory;
503032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        while (rec != null) {
503132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (rec.time >= 0) rec.writeToParcel(out, 0);
503232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            rec = rec.next;
503332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
503432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        out.writeLong(-1);
503532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
50365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
50389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
50399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
50401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readFromParcel: version got " + version
50419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
50429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
50439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5045ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        readHistory(in, true);
50465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
50489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
50499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
50509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
50526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5053633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
50543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
50553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
5056c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
5057c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
50585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
50605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
50629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
5063617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5064617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
5065617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5066617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
50679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
50689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
50695284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5070627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
5071627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5072f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in);
5073627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5074627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
5075627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5076105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
5077105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
507858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
507958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in);
5080105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
5081105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
50829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
50841afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NKW > 10000) {
50851afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW);
50861afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
50871afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
5088c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5089c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5090c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
5091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
5092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5093c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5094e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5095e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5096e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
50981afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NU > 10000) {
50991afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many uids " + NU);
51001afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
51011afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
51029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
51049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
510758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            u.mWifiRunning = false;
51086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
510958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.readSummaryFromParcelLocked(in);
51106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5111105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
51126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
51146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
51166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
51186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastEnabled = false;
51206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
51226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mAudioTurnedOn = false;
51246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in);
51266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mVideoTurnedOn = false;
51286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in);
51306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51315347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
5132617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
5133617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
5134617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
5135617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5136617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5137617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
5138617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5139617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
51405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
51419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
51427b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NW > 100) {
51431afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many wake locks " + NW);
51441afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
51451afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
51469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
51479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
51489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
51509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
51569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
51607b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
51611afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many sensors " + NP);
51621afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
51631afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
51649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
51659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
51669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
51689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
51699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
51737b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
51741afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many processes " + NP);
51751afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
51761afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
51779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
51789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
51799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
51809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
51819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
51829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
518358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                int NSB = in.readInt();
51847b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NSB > 100) {
51857b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many speed bins " + NSB);
51867b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
51877b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
518858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                p.mSpeedBins = new SamplingCounter[NSB];
518958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<NSB; i++) {
519058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (in.readInt() != 0) {
519158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i] = new SamplingCounter(mUnpluggables);
519258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i].readSummaryFromParcelLocked(in);
519358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
519458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
51957b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (!p.readExcessivePowerFromParcelLocked(in)) {
51967b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
51977b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
51989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
52011afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
52021afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many packages " + NP);
52031afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
52041afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
52059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
52069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
52079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
52089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
52099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
52107b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NS > 1000) {
52117b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many services " + NS);
52127b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
52137b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
52149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
52209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
52249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
52259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
52309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
52319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
52339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
52350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
52360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
52370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5245ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        writeHistory(out, true);
52465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
52486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED));
52496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
52506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED));
52516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
52526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5253633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
5254e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getLowDischargeAmountSinceCharge());
5255e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getHighDischargeAmountSinceCharge());
5256c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOnSinceCharge());
5257c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOffSinceCharge());
52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52655284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5266627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5267627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5268f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5269627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5270627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5271627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5272105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
527358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5274105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5276c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
5277c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
5278c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
5279c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
5280c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
5281c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
5282c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
5283c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
5284c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
5285c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5286c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
52875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5288e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
52919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
52929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
52939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
52945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
529558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (u.mWifiRunningTimer != null) {
52966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
529758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
52996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mFullWifiLockTimer != null) {
53026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mScanWifiLockTimer != null) {
53086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mWifiMulticastTimer != null) {
53146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mAudioTurnedOnTimer != null) {
53206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mVideoTurnedOnTimer != null) {
53266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5332617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
5333617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
5334617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
5335617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
5336617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5337617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
5338617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5339617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
53405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
53419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
53429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
53439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
53449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
53479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
53499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
53519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
53559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
53579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
53619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
53639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
53679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
53709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
53719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
53729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
53739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
53749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
53759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
53769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
53889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
53899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
53909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
53919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
53929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
53939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
53949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
539558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    final int N = ps.mSpeedBins.length;
539658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    out.writeInt(N);
539758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    for (int i=0; i<N; i++) {
539858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (ps.mSpeedBins[i] != null) {
539958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(1);
540058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            ps.mSpeedBins[i].writeSummaryFromParcelLocked(out);
540158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        } else {
540258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(0);
540358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
540458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
5405287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ps.writeExcessivePowerToParcelLocked(out);
54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
54119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
54209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
54219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
54229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
54239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED));
54346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED));
54359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
54399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
54409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
54439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
54449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
54459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
54469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5448ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        readHistory(in, false);
54495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
54519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
54523bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastUptime = 0;
54539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
54543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastRealtime = 0;
54559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
54560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in);
5457617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
54580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i,
54590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5460617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5461617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
54630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
54645284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
54650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i,
54660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5467627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
54680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in);
5469627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
54700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i,
54710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5472627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5473105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
54740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
547558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
547658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
5477105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
54780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
54799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
54809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
54813bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastUptime = 0;
54829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
54839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
54843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastRealtime = 0;
54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
54936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5494633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
54953bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
54963bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
5497c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = in.readInt();
5498c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
5499c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = in.readInt();
5500c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
55019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
55029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_LAST] = in.readLong();
55046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1;
55053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_LAST] = in.readLong();
55066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1;
55073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_LAST] = in.readLong();
55086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1;
55093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_LAST] = in.readLong();
55106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1;
55113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55123718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = in.readLong();
55133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
55143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55153f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = in.readInt();
55163f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
55173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
5518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
5519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
5520c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
5523244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel
5524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
5525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
5526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
55285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
55309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
55319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
553258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiRunningTimers.clear();
553358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mFullWifiLockTimers.clear();
553458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mScanWifiLockTimers.clear();
553558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiMulticastTimers.clear();
55369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5537e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5538e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
55399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
55409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
55419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
55429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
55439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
55449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
55459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
55469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
55503bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, true, flags);
55513bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
55523bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
55533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public void writeToParcelWithoutUids(Parcel out, int flags) {
55543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, false, flags);
55559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55575a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    @SuppressWarnings("unused")
55583bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void writeToParcelLocked(Parcel out, boolean inclUids, int flags) {
55590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
55600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
55610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
55629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
55639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
55649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
55659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
55665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
55685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5569ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        writeHistory(out, false);
55705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
55729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
55739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
55749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
5575617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5576617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
5577617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5578617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
55799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
55805284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5581627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
5582627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5583f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime);
5584627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5585627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
5586627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5587105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
558858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime);
5589105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
55909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
55919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
55929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
55939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
55959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
55969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
55979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
55989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
55999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
56009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
56016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5602633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
56033bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mLowDischargeAmountSinceCharge);
56043bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mHighDischargeAmountSinceCharge);
5605c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOn);
5606c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOnSinceCharge);
5607c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOff);
5608c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOffSinceCharge);
56099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
56109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED));
56126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED));
56136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED));
56146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED));
56153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
56163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Write radio uptime for data
56173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeLong(getRadioDataUptime());
56183f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
56193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeInt(getBluetoothPingCount());
56203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
56213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
56223bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(mKernelWakelockStats.size());
56233bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
56243bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                SamplingTimer kwlt = ent.getValue();
56253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (kwlt != null) {
56263bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(1);
56273bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeString(ent.getKey());
56283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
56293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                } else {
56303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(0);
56313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                }
5632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
56333bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
56343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
5635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5636e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5637e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
5638e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
56393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
56403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            int size = mUidStats.size();
56413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(size);
56423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (int i = 0; i < size; i++) {
56433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                out.writeInt(mUidStats.keyAt(i));
56443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                Uid uid = mUidStats.valueAt(i);
56459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56463bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                uid.writeToParcelLocked(out, batteryRealtime);
56473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
56483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
56493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
56509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
56549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
56559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
56569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
56579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
56609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
56619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
56635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
56640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void prepareForDumpLocked() {
56650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to retrieve current kernel wake lock stats before printing.
56660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
56670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
56680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
56691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
56709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
56711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
56721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
56731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
5674617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
56751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
56761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
5677617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
56781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
56791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
56801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
56811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
56825284090631e638b916d9a453212e9dc802656a67Wink Saville            for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
56831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
56841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
5685627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
5686f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            pr.println("*** Signal scanning :");
5687f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.logState(pr, "  ");
5688627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
56891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
56901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
56911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
56921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
56931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
56941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
569558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.logState(pr, "  ");
56961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
56971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
56981059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            pr.println("*** Mobile ifaces:");
56991059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            pr.println(mMobileIfaces.toString());
57009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
57019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
57029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57031059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57041059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats mNetworkSummaryCache;
57051059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats mNetworkDetailCache;
57061059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57071059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats getNetworkStatsSummary() {
57081059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // NOTE: calls from BatteryStatsService already hold this lock
57091059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (this) {
57101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (mNetworkSummaryCache == null
57111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    || mNetworkSummaryCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) {
57121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                try {
57131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkSummaryCache = mNetworkStatsFactory.readNetworkStatsSummary();
57141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                } catch (IllegalStateException e) {
57151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    // log problem and return empty object
57161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    Log.wtf(TAG, "problem reading network stats", e);
57171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkSummaryCache = new NetworkStats(SystemClock.elapsedRealtime(), 0);
57181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
57191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
57201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            return mNetworkSummaryCache;
57211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
57221059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
57231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats getNetworkStatsDetailGroupedByUid() {
57251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // NOTE: calls from BatteryStatsService already hold this lock
57261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (this) {
57271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (mNetworkDetailCache == null
57281059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    || mNetworkDetailCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) {
57291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                try {
57301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkDetailCache = mNetworkStatsFactory
57311059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                            .readNetworkStatsDetail().groupedByUid();
57321059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                } catch (IllegalStateException e) {
57331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    // log problem and return empty object
57341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    Log.wtf(TAG, "problem reading network stats", e);
57351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkDetailCache = new NetworkStats(SystemClock.elapsedRealtime(), 0);
57361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
57371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
57381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            return mNetworkDetailCache;
57391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
57401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
57419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5742