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