BatteryStatsImpl.java revision 73f534a2dd324d631696ced762f5c0ab1f254f74
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.IFACE_ALL;
201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.UID_ALL;
211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.text.format.DateUtils.SECOND_IN_MILLIS;
22418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkeyimport static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED;
231afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn
243f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothDevice;
253f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset;
261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.content.res.Resources;
271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.ConnectivityManager;
281059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.NetworkStats;
296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackbornimport android.os.BatteryManager;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
318bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils;
320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Handler;
330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Message;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
37c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
39418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkeyimport android.os.SystemProperties;
407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
41f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState;
42e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
43627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackbornimport android.util.LogWriter;
461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
481afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport android.util.Slog;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
50ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackbornimport android.util.TimeUtils;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.R;
531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.net.NetworkStatsFactory;
541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.util.JournaledFile;
551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.google.android.collect.Sets;
561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
573718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
661059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.util.HashSet;
67c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator;
685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganeshimport java.util.List;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
704cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger;
71ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackbornimport java.util.concurrent.locks.ReentrantLock;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
8132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    private static final boolean DEBUG_HISTORY = false;
82e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn    private static final boolean USE_OLD_HISTORY = false;   // for debugging.
835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
841059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    // TODO: remove "tcp" from network methods, since we measure total stats.
851059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
90e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn    private static final int VERSION = 61 + (USE_OLD_HISTORY ? 1000 : 0);
91e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // Maximum number of items we will record in the history.
937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_HISTORY_ITEMS = 2000;
945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
95f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    // No, really, THIS is the maximum number of items we will record in the history.
96f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    private static final int MAX_MAX_HISTORY_ITEMS = 3000;
97f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
989e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // The maximum number of names wakelocks we will keep track of
999e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // per uid; once the limit is reached, we batch the remaining wakelocks
1009e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // in to one common name.
1017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_WAKELOCKS_PER_UID = 30;
1025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
103c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn    // The system process gets more.  It is special.  Oh so special.
104c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn    // With, you know, special needs.  Like this.
105c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn    private static final int MAX_WAKELOCKS_PER_UID_IN_SYSTEM = 50;
106c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn
1079e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    private static final String BATCHED_WAKELOCK_NAME = "*overflow*";
1085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
109e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private static int sNumSpeedSteps;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    private final JournaledFile mFile;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_UPDATE_WAKELOCKS = 1;
1140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_REPORT_POWER_CHANGE = 2;
115287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    static final long DELAY_UPDATE_WAKELOCKS = 5*1000;
1160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public interface BatteryCallback {
1180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryNeedsCpuUpdate();
1190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryPowerChanged(boolean onBattery);
1200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
1210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final class MyHandler extends Handler {
1230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        @Override
1240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void handleMessage(Message msg) {
1250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            BatteryCallback cb = mCallback;
1260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            switch (msg.what) {
1270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_UPDATE_WAKELOCKS:
1280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryNeedsCpuUpdate();
1300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_REPORT_POWER_CHANGE:
1330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryPowerChanged(msg.arg1 != 0);
1350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
1380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
1390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
1400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private final MyHandler mHandler;
1420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private BatteryCallback mCallback;
1440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
155c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>();
156c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>();
157c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>();
158c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers
159c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            = new SparseArray<ArrayList<StopwatchTimer>>();
16058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>();
16158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>();
16258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>();
1636ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    final ArrayList<StopwatchTimer> mWifiScanTimers = new ArrayList<StopwatchTimer>();
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    // Last partial timers we use for distributing CPU usage.
1660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>();
1670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
1715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mShuttingDown;
1735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    long mHistoryBaseTime;
1756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mHaveBatteryLevel = false;
1766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mRecordingHistory = true;
1776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mNumHistoryItems;
1780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1791fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    static final int MAX_HISTORY_BUFFER = 128*1024; // 128KB
1801fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    static final int MAX_MAX_HISTORY_BUFFER = 144*1024; // 144KB
1810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final Parcel mHistoryBuffer = Parcel.obtain();
1820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryLastWritten = new HistoryItem();
1830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryLastLastWritten = new HistoryItem();
1841fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    final HistoryItem mHistoryReadTmp = new HistoryItem();
1850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    int mHistoryBufferLastPos = -1;
1860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    boolean mHistoryOverflow = false;
1870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    long mLastHistoryTime = 0;
1880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryCur = new HistoryItem();
1900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistory;
1926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryEnd;
1939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    HistoryItem mHistoryLastEnd;
1946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryCache;
1950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private HistoryItem mHistoryIterator;
1970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private boolean mReadOverflow;
1980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private boolean mIteratingHistory;
1995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
2135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
215c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mScreenOnTimer;
2163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
217617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mScreenBrightnessBin = -1;
218c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
2195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    Counter mInputEventCounter;
2215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
223c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mPhoneOnTimer;
2245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
225244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mAudioOn;
226244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mAudioOnTimer;
2275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
228244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mVideoOn;
229244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mVideoOnTimer;
2305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
231627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
232e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    int mPhoneSignalStrengthBinRaw = -1;
233c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneSignalStrengthsTimer =
2345284090631e638b916d9a453212e9dc802656a67Wink Saville            new StopwatchTimer[SignalStrength.NUM_SIGNAL_STRENGTH_BINS];
235f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
236f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    StopwatchTimer mPhoneSignalScanningTimer;
237f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
238627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
2395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    final StopwatchTimer[] mPhoneDataConnectionsTimer =
240c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
2415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
242105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
243c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiOnTimer;
244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mWifiOnUid = -1;
245d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
24658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    boolean mGlobalWifiRunning;
24758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    StopwatchTimer mGlobalWifiRunningTimer;
2485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
249105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
250c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mBluetoothOnTimer;
2513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /** Bluetooth headset object */
2533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    BluetoothHeadset mBtHeadset;
2543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
2653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
2683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
269105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
270105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
271105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
272633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeStartLevel;
2736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mDischargeUnplugLevel;
274633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeCurrentLevel;
2753bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mLowDischargeAmountSinceCharge;
2763bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mHighDischargeAmountSinceCharge;
277c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeScreenOnUnplugLevel;
278c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeScreenOffUnplugLevel;
279c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOn;
280c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOnSinceCharge;
281c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOff;
282c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOffSinceCharge;
283244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
285244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    // Mobile data transferred while on battery
2873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataTx = new long[4];
2883718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataRx = new long[4];
2893718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataTx = new long[4];
2903718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataRx = new long[4];
2913718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2923718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataUptime;
2933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataStart;
2943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2953f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingCount;
2963f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingStart = -1;
2973f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
298f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private int mPhoneServiceState = -1;
299e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int mPhoneServiceStateRaw = -1;
300e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int mPhoneSimStateRaw = -1;
301f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
302c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
303c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
304c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
3055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private final HashMap<String, SamplingTimer> mKernelWakelockStats =
306c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, SamplingTimer>();
3075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public Map<String, ? extends SamplingTimer> getKernelWakelockStats() {
309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mKernelWakelockStats;
310c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
3115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
312c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static int sKernelWakelockUpdateVersion = 0;
3135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
314c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int[] PROC_WAKELOCKS_FORMAT = new int[] {
315c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
316c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 1: count
317c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
319c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
320c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 5: totalTime
321c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    };
3225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
32373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor    private static final int[] WAKEUP_SOURCES_FORMAT = new int[] {
32473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
32573f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        Process.PROC_TAB_TERM|Process.PROC_COMBINE|
32673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                              Process.PROC_OUT_LONG,                  // 1: count
32773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        Process.PROC_TAB_TERM|Process.PROC_COMBINE,
32873f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        Process.PROC_TAB_TERM|Process.PROC_COMBINE,
32973f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        Process.PROC_TAB_TERM|Process.PROC_COMBINE,
33073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        Process.PROC_TAB_TERM|Process.PROC_COMBINE,
33173f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        Process.PROC_TAB_TERM|Process.PROC_COMBINE
33273f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                             |Process.PROC_OUT_LONG,                  // 6: totalTime
33373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor    };
33473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor
335c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final String[] mProcWakelocksName = new String[3];
336c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final long[] mProcWakelocksData = new long[3];
3375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
338c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
339c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added
340c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * to mKernelWakelockStats.
341c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
3425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private final Map<String, KernelWakelockStats> mProcWakelockFileStats =
343c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, KernelWakelockStats>();
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>();
3465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3471059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory();
3481059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
3491059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    /** Network ifaces that {@link ConnectivityManager} has claimed as mobile. */
3501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private HashSet<String> mMobileIfaces = Sets.newHashSet();
3511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
3541afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
3550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
365617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
366e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class Counter extends BatteryStats.Counter implements Unpluggable {
3674cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        final AtomicInteger mCount = new AtomicInteger();
3686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLoadedCount;
370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLastCount;
371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mUnpluggedCount;
372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mPluggedCount;
3735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables, Parcel in) {
3756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
3764cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = in.readInt();
3774cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLoadedCount = in.readInt();
3793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
380617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = in.readInt();
381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
384617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables) {
3856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
387617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
389617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void writeToParcel(Parcel out) {
3904cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(mCount.get());
391617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLoadedCount);
392617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mUnpluggedCount);
393617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void unplug(long batteryUptime, long batteryRealtime) {
3964cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount;
3974cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
399617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
400617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void plug(long batteryUptime, long batteryRealtime) {
4014cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = mCount.get();
402617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
404617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
405617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Writes a possibly null Counter to a Parcel.
406617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
407617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param out the Parcel to be written to.
408617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param counter a Counter, or null.
409617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
410617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static void writeCounterToParcel(Parcel out, Counter counter) {
411617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (counter == null) {
412617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0); // indicates null
413617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return;
414617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
415617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(1); // indicates non-null
416617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
417617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            counter.writeToParcel(out);
418617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
419617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
420617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
421c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
422617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            int val;
423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (which == STATS_LAST) {
424617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mLastCount;
425617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
4264cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate                val = mCount.get();
4276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
428617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mUnpluggedCount;
4296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
430617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mLoadedCount;
431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
432617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
434617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return val;
435617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
436617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
437617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void logState(Printer pw, String prefix) {
4384cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            pw.println(prefix + "mCount=" + mCount.get()
439617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
440617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mUnpluggedCount=" + mUnpluggedCount
441617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mPluggedCount=" + mPluggedCount);
442617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4444cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        void stepAtomic() {
4454cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.incrementAndGet();
446617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
447617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
4486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
4496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this counter.
4506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
4516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void reset(boolean detachIfReset) {
4526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount.set(0);
4536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
4546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
4556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
4566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
4576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
4606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
4616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
463617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void writeSummaryFromParcelLocked(Parcel out) {
4644cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            int count = mCount.get();
4654cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(count);
466617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
467617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
468617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void readSummaryFromParcelLocked(Parcel in) {
4694cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mLoadedCount = in.readInt();
4704cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mLoadedCount);
4713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
4724cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount = mLoadedCount;
473617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
474617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
475e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
476e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class SamplingCounter extends Counter {
477e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
478e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) {
479e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables, in);
480e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
481e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
482e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables) {
483e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables);
484e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
485e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4864cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        public void addCountAtomic(long count) {
4874cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.addAndGet((int)count);
488e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
489e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
490e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
491617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static abstract class Timer extends BatteryStats.Timer implements Unpluggable {
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
4966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
4975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
5025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
5055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
5125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
5185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
5245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
5315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
532244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        /**
533244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * Constructs from a parcel.
534244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param type
535244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param unpluggables
536244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param powerType
537244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param in
538244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         */
539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) {
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
5416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
5425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
5453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
5493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
5566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract long computeRunTimeLocked(long curBatteryRealtime);
5615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract int computeCurrentCountLocked();
5635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
5656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this timer.  Returns true if the timer is inactive
5666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * so can be completely dropped.
5676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
5689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
5696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mTotalTime = mLoadedTime = mLastTime = 0;
5706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount = mLoadedCount = mLastCount = 0;
5716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
5726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
5736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
5756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
5786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
5796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " old mTotalTime=" + mTotalTime);
609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
610c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = computeRunTimeLocked(batteryRealtime);
611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = computeCurrentCountLocked();
612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType
614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + ": new mTotalTime=" + mTotalTime);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long getTotalTimeLocked(long batteryRealtime, int which) {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
6426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
6446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                val = computeCurrentCountLocked();
6596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
6616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + " mCount=" + mCount
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
673627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
675627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
6785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
6795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long runTime = computeRunTimeLocked(batteryRealtime);
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Divide by 1000 for backwards compatibility
683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong((runTime + 500) / 1000);
684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount);
685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Multiply by 1000 for backwards compatibility
689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = mLoadedTime = in.readLong() * 1000;
6903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedTime = mTotalTime;
692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = mLoadedCount = in.readInt();
6933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedCount = mCount;
695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
6975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class SamplingTimer extends Timer {
6995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported count from /proc/wakelocks.
702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mCurrentReportedCount;
704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported count from /proc/wakelocks when unplug() was last
707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUnpluggedReportedCount;
710c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
711c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported total_time from /proc/wakelocks.
7135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh         */
714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mCurrentReportedTotalTime;
715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported total_time from /proc/wakelocks when unplug() was last
719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUnpluggedReportedTotalTime;
722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
723c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
724c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently in a discharge cycle.
725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
726c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mInDischarge;
727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently recording reported values.
730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mTrackingReportedValues;
7325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /*
734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * A sequnce counter, incremented once for each update of the stats.
735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUpdateVersion;
7375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) {
739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables, in);
740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = in.readInt();
741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = in.readInt();
742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = in.readLong();
743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = in.readLong();
744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
7485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge,
749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                boolean trackReportedValues) {
750c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables);
751c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = trackReportedValues;
752c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setStale() {
756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = false;
757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = 0;
758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = 0;
759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setUpdateVersion(int version) {
762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateVersion = version;
763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
765c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getUpdateVersion() {
766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUpdateVersion;
767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
769c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedCount(int count) {
770c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedCount == 0) {
771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = count;
773c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
775c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = count;
777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedTotalTime(long totalTime) {
780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedTotalTime == 0) {
781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = totalTime;
783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = totalTime;
787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void unplug(long batteryUptime, long batteryRealtime) {
790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.unplug(batteryUptime, batteryRealtime);
791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mTrackingReportedValues) {
792c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
793c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = mCurrentReportedCount;
794c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = true;
796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
797c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
798c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.plug(batteryUptime, batteryRealtime);
800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = false;
801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
8055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
8125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            return mTotalTime + (mInDischarge && mTrackingReportedValues
813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount + (mInDischarge && mTrackingReportedValues
818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mUnpluggedReportedCount);
825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUnpluggedReportedTotalTime);
827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
8309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
8319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, detachIfReset);
8326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            setStale();
8336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
8346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
8355a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeSummaryFromParcelLocked(out, batteryRealtime);
838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
8505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /**
852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * State for keeping track of timing information.
853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class StopwatchTimer extends Timer {
8550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final Uid mUid;
856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        final ArrayList<StopwatchTimer> mTimerPool;
8570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mNesting;
859c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
860c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
861c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The last time at which we updated the timer.  If mNesting is > 0,
862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * subtract this from the current battery time to find the amount of
863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * time we have been running since we last computed an update.
864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUpdateTime;
8665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
8689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The total time at which the timer was acquired, to determine if it
869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * was actually held for an interesting duration.
870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mAcquireTime;
872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
873f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        long mTimeout;
874f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
8750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        /**
8760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * For partial wake locks, keep track of whether we are in the list
8770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * to consume CPU cycles.
8780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         */
8790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean mInList;
8800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
8810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables, Parcel in) {
883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables, in);
8840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
886c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateTime = in.readLong();
887c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
8890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
890c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables) {
891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables);
8920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
896f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        void setTimeout(long timeout) {
897f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mTimeout = timeout;
898f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
899f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
900c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
901c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
902c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUpdateTime);
903c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
904c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
905c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mNesting > 0) {
907c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
908c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
909c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
910c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                super.plug(batteryUptime, batteryRealtime);
911c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUpdateTime = batteryRealtime;
912c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
913c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
914c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
915c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
916c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
917c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
918c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
919c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
920c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
94632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        boolean isRunningLocked() {
94732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            return mNesting > 0;
94832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
94932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                    final long realtime = SystemClock.elapsedRealtime() * 1000;
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
987c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final ArrayList<StopwatchTimer> pool) {
9885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            final long realtime = SystemClock.elapsedRealtime() * 1000;
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
992c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final StopwatchTimer t = pool.get(i);
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1001c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
1002c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
1003f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) {
1004f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                curBatteryRealtime = mUpdateTime + mTimeout;
1005f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
1013c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
1014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount;
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
10186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean canDetach = mNesting <= 0;
10199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, canDetach && detachIfReset);
10209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mNesting > 0) {
10219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mUpdateTime = stats.getBatteryRealtimeLocked(
10229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        SystemClock.elapsedRealtime() * 1000);
10239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
10249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mAcquireTime = mTotalTime;
10256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return canDetach;
10266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
10275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
10286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
10296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            super.detach();
10306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mTimerPool != null) {
10316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mTimerPool.remove(this);
10326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
10336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
10345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
1036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> readKernelWakelockStats() {
10425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
104373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        FileInputStream is;
10443372f2e259247810627fd22033406163284f4f64Johannes Carlsson        byte[] buffer = new byte[8192];
1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int len;
104673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        boolean wakeup_sources = false;
10475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        try {
104973f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor            try {
105073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                is = new FileInputStream("/proc/wakelocks");
105173f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor            } catch (java.io.FileNotFoundException e) {
105273f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                try {
105373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                    is = new FileInputStream("/d/wakeup_sources");
105473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                    wakeup_sources = true;
105573f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                } catch (java.io.FileNotFoundException e2) {
105673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                    return null;
105773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                }
105873f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor            }
105973f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor
1060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            len = is.read(buffer);
1061c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            is.close();
106273f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        } catch (java.io.IOException e) {
106373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor            return null;
106473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        }
1065c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
106673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        if (len > 0) {
106773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor            int i;
106873f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor            for (i=0; i<len; i++) {
106973f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                if (buffer[i] == '\0') {
107073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                    len = i;
107173f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                    break;
1072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1073c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1074c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
10755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
107673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor        return parseProcWakelocks(buffer, len, wakeup_sources);
1077c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
10785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1079c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> parseProcWakelocks(
108073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor            byte[] wlBuffer, int len, boolean wakeup_sources) {
1081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        String name;
1082c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int count;
1083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long totalTime;
10841059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        int startIndex;
10851059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        int endIndex;
1086c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int numUpdatedWlNames = 0;
1087c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1088c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        // Advance past the first line.
1089c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int i;
1090c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++);
1091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        startIndex = endIndex = i + 1;
1092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1093c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        synchronized(this) {
1094c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Map<String, KernelWakelockStats> m = mProcWakelockFileStats;
10955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            sKernelWakelockUpdateVersion++;
1097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            while (endIndex < len) {
10985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                for (endIndex=startIndex;
10995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                        endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0';
1100c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex++);
11013372f2e259247810627fd22033406163284f4f64Johannes Carlsson                endIndex++; // endIndex is an exclusive upper bound.
11023372f2e259247810627fd22033406163284f4f64Johannes Carlsson                // Don't go over the end of the buffer, Process.parseProcLine might
11033372f2e259247810627fd22033406163284f4f64Johannes Carlsson                // write to wlBuffer[endIndex]
11043372f2e259247810627fd22033406163284f4f64Johannes Carlsson                if (endIndex >= (len - 1) ) {
11053372f2e259247810627fd22033406163284f4f64Johannes Carlsson                    return m;
1106e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                }
1107c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1108c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String[] nameStringArray = mProcWakelocksName;
1109c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                long[] wlData = mProcWakelocksData;
11102098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // Stomp out any bad characters since this is from a circular buffer
11112098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // A corruption is seen sometimes that results in the vm crashing
11122098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // This should prevent crashes and the line will probably fail to parse
11132098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                for (int j = startIndex; j < endIndex; j++) {
11142098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                    if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?';
11152098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                }
111653b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex,
111773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                        wakeup_sources ? WAKEUP_SOURCES_FORMAT :
111873f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                                         PROC_WAKELOCKS_FORMAT,
111973f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                        nameStringArray, wlData, null);
11202098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani
1121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                name = nameStringArray[0];
1122c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                count = (int) wlData[1];
112373f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor
112473f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                if (wakeup_sources) {
112573f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                        // convert milliseconds to microseconds
112673f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                        totalTime = wlData[2] * 1000;
112773f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                } else {
112873f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                        // convert nanoseconds to microseconds with rounding.
112973f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                        totalTime = (wlData[2] + 500) / 1000;
113073f534a2dd324d631696ced762f5c0ab1f254f74Todd Poynor                }
1131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
113253b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                if (parsed && name.length() > 0) {
1133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (!m.containsKey(name)) {
11345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                        m.put(name, new KernelWakelockStats(count, totalTime,
1135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                sKernelWakelockUpdateVersion));
1136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        numUpdatedWlNames++;
1137c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    } else {
1138c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        KernelWakelockStats kwlStats = m.get(name);
1139c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        if (kwlStats.mVersion == sKernelWakelockUpdateVersion) {
1140c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount += count;
1141c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime += totalTime;
1142c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        } else {
1143c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount = count;
1144c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime = totalTime;
1145c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mVersion = sKernelWakelockUpdateVersion;
1146c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            numUpdatedWlNames++;
1147c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        }
1148c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
114953b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                }
1150c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                startIndex = endIndex;
1151c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1152c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1153c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (m.size() != numUpdatedWlNames) {
1154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Don't report old data.
1155c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Iterator<KernelWakelockStats> itr = m.values().iterator();
1156c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                while (itr.hasNext()) {
1157c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (itr.next().mVersion != sKernelWakelockUpdateVersion) {
1158c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        itr.remove();
1159c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
1160c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1161c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1162c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return m;
1163c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1164c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1166c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private class KernelWakelockStats {
1167c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mCount;
1168c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long mTotalTime;
1169c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mVersion;
11705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1171c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        KernelWakelockStats(int count, long totalTime, int version) {
1172c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = count;
1173c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = totalTime;
1174c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mVersion = version;
1175c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1178c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
11795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh     * Get the KernelWakelockTimer associated with name, and create a new one if one
1180c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * doesn't already exist.
1181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
1182c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public SamplingTimer getKernelWakelockTimerLocked(String name) {
1183c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer kwlt = mKernelWakelockStats.get(name);
1184c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kwlt == null) {
11855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
1186c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    true /* track reported values */);
1187c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mKernelWakelockStats.put(name, kwlt);
1188c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1189c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return kwlt;
1190c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11913718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11923718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataPlug(long[] dataTransfer, long currentBytes) {
11936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_LAST] = dataTransfer[STATS_SINCE_UNPLUGGED];
11946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = -1;
11953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataUnplug(long[] dataTransfer, long currentBytes) {
11986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = currentBytes;
11993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
12003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
12013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
12023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Radio uptime in microseconds when transferring data. This value is very approximate.
12033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return
12043f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
12053f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private long getCurrentRadioDataUptime() {
12063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        try {
12073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
12083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (!awakeTimeFile.exists()) return 0;
12093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
12103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            String line = br.readLine();
12113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            br.close();
12123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return Long.parseLong(line) * 1000;
12133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (NumberFormatException nfe) {
12143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
12153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (IOException ioe) {
12163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
12173718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
12183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return 0;
12193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
12203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
12213f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
12223f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
12233f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
12243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getRadioDataUptimeMs() {
12253f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
12263f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12273f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
12295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh     * Returns the duration that the cell radio was up for data transfers.
12303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
12313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptime() {
12323718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (mRadioDataStart == -1) {
12333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return mRadioDataUptime;
12343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
12353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentRadioDataUptime() - mRadioDataStart;
12363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
12373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
12383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
12393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int getCurrentBluetoothPingCount() {
12403f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBtHeadset != null) {
12415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            List<BluetoothDevice> deviceList = mBtHeadset.getConnectedDevices();
12425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            if (deviceList.size() > 0) {
12435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                return mBtHeadset.getBatteryUsageHint(deviceList.get(0));
12443f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            }
12453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
12463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return -1;
12473f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12483f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public int getBluetoothPingCount() {
12503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBluetoothPingStart == -1) {
12513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBluetoothPingCount;
12523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        } else if (mBtHeadset != null) {
12533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentBluetoothPingCount() - mBluetoothPingStart;
12543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
125582cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        return 0;
12563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12573f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12583f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public void setBtHeadset(BluetoothHeadset headset) {
125982cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) {
126082cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani            mBluetoothPingStart = getCurrentBluetoothPingCount();
126182cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        }
12623f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBtHeadset = headset;
12633f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12643f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    int mChangedBufferStates = 0;
12660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void addHistoryBufferLocked(long curTime) {
12680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!mHaveBatteryLevel || !mRecordingHistory) {
12690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12721fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        final long timeDiff = (mHistoryBaseTime+curTime) - mHistoryLastWritten.time;
12730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mHistoryBufferLastPos >= 0 && mHistoryLastWritten.cmd == HistoryItem.CMD_UPDATE
12741fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                && timeDiff < 2000
12750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                && ((mHistoryLastWritten.states^mHistoryCur.states)&mChangedBufferStates) == 0) {
12760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // If the current is the same as the one before, then we no
12770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // longer need the entry.
12780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataSize(mHistoryBufferLastPos);
12790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(mHistoryBufferLastPos);
12800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBufferLastPos = -1;
12810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (mHistoryLastLastWritten.cmd == HistoryItem.CMD_UPDATE
12821fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    && timeDiff < 500 && mHistoryLastLastWritten.same(mHistoryCur)) {
12830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // If this results in us returning to the state written
12840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // prior to the last one, then we can just delete the last
12850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // written one and drop the new one.  Nothing more to do.
12860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryLastWritten.setTo(mHistoryLastLastWritten);
12870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL;
12880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                return;
12890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mChangedBufferStates |= mHistoryLastWritten.states^mHistoryCur.states;
12910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            curTime = mHistoryLastWritten.time - mHistoryBaseTime;
12921fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mHistoryLastWritten.setTo(mHistoryLastLastWritten);
12930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else {
12940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mChangedBufferStates = 0;
12950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        final int dataSize = mHistoryBuffer.dataSize();
12980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (dataSize >= MAX_HISTORY_BUFFER) {
12990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (!mHistoryOverflow) {
13000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryOverflow = true;
13010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                addHistoryBufferLocked(curTime, HistoryItem.CMD_OVERFLOW);
13020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
13030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
13040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // Once we've reached the maximum number of items, we only
13050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // record changes to the battery level and the most interesting states.
13060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // Once we've reached the maximum maximum number of items, we only
13070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // record changes to the battery level.
13080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (mHistoryLastWritten.batteryLevel == mHistoryCur.batteryLevel &&
13090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    (dataSize >= MAX_MAX_HISTORY_BUFFER
131045f06460e9aeadadad27e6c87817940cd96128efAmith Yamasani                            || ((mHistoryLastWritten.states^mHistoryCur.states)
13110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                                    & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
13120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                return;
13130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
13140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
13150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
13160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(curTime, HistoryItem.CMD_UPDATE);
13170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
13180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
13190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void addHistoryBufferLocked(long curTime, byte cmd) {
13200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int origPos = 0;
13210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mIteratingHistory) {
13220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            origPos = mHistoryBuffer.dataPosition();
13230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
13240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
13250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBufferLastPos = mHistoryBuffer.dataPosition();
13260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastLastWritten.setTo(mHistoryLastWritten);
13270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur);
13280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.writeDelta(mHistoryBuffer, mHistoryLastLastWritten);
13290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mLastHistoryTime = curTime;
13300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "Writing history buffer: was " + mHistoryBufferLastPos
13310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " now " + mHistoryBuffer.dataPosition()
13320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " size is now " + mHistoryBuffer.dataSize());
13330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mIteratingHistory) {
13340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(origPos);
13350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
13360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
13370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1338f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    int mChangedStates = 0;
1339f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
13406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime) {
13410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(curTime);
13420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1343e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
1344e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
1345e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
1346e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn
13476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (!mHaveBatteryLevel || !mRecordingHistory) {
13486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
13496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
13509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        // If the current time is basically the same as the last time,
1352f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // and no states have since the last recorded entry changed and
1353f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // are now resetting back to their original value, then just collapse
1354f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // into one record.
13559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE
1356f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+2000)
1357f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && ((mHistoryEnd.states^mHistoryCur.states)&mChangedStates) == 0) {
13589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // If the current is the same as the one before, then we no
13599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // longer need the entry.
13609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE
13611fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+500)
13629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && mHistoryLastEnd.same(mHistoryCur)) {
13639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd.next = null;
13649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.next = mHistoryCache;
13659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryCache = mHistoryEnd;
13669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd = mHistoryLastEnd;
13679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd = null;
13689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            } else {
1369f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                mChangedStates |= mHistoryEnd.states^mHistoryCur.states;
13709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, mHistoryCur);
13719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
13729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return;
13739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
13749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1375f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        mChangedStates = 0;
1376f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
1377f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        if (mNumHistoryItems == MAX_HISTORY_ITEMS
1378f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) {
13797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            addHistoryRecordLocked(curTime, HistoryItem.CMD_OVERFLOW);
13807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
13817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
13826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mNumHistoryItems >= MAX_HISTORY_ITEMS) {
13836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // Once we've reached the maximum number of items, we only
1384f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // record changes to the battery level and the most interesting states.
1385f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // Once we've reached the maximum maximum number of items, we only
13866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // record changes to the battery level.
13876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryEnd != null && mHistoryEnd.batteryLevel
1388f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    == mHistoryCur.batteryLevel &&
1389f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS
1390f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                            || ((mHistoryEnd.states^mHistoryCur.states)
1391f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                                    & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
13926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return;
13936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
13946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
13959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE);
13976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
13985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime, byte cmd) {
14006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistoryCache;
140132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (rec != null) {
140232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCache = rec.next;
140332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
14046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            rec = new HistoryItem();
140532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
14066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur);
14075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
14086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(rec);
140932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
14105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
14116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(HistoryItem rec) {
14126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mNumHistoryItems++;
141332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        rec.next = null;
14149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mHistoryLastEnd = mHistoryEnd;
141532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mHistoryEnd != null) {
141632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd.next = rec;
141732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd = rec;
141832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
141932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistory = mHistoryEnd = rec;
142032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
142132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
14225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
14236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void clearHistoryLocked() {
14240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "********** CLEARING HISTORY!");
1425e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (USE_OLD_HISTORY) {
1426e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            if (mHistory != null) {
1427e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn                mHistoryEnd.next = mHistoryCache;
1428e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn                mHistoryCache = mHistory;
1429e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn                mHistory = mHistoryLastEnd = mHistoryEnd = null;
1430e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            }
1431e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            mNumHistoryItems = 0;
143232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
1433e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn
14346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mHistoryBaseTime = 0;
14350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mLastHistoryTime = 0;
14360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
14370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataSize(0);
14380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
14390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER/2);
14400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL;
14410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.cmd = HistoryItem.CMD_NULL;
14420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBufferLastPos = -1;
14430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryOverflow = false;
144432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
14455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
14466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doUnplugLocked(long batteryUptime, long batteryRealtime) {
14471059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        NetworkStats.Entry entry = null;
14481059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14491059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // Track UID data usage
14501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats uidStats = getNetworkStatsDetailGroupedByUid();
14511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final int size = uidStats.size();
14521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        for (int i = 0; i < size; i++) {
14531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            entry = uidStats.getValues(i, entry);
14541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final Uid u = mUidStats.get(entry.uid);
14561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (u == null) continue;
14571059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            u.mStartedTcpBytesReceived = entry.rxBytes;
14591059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            u.mStartedTcpBytesSent = entry.txBytes;
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // Track both mobile and total overall data
14691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats ifaceStats = getNetworkStatsSummary();
14701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry, mMobileIfaces);
14711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mMobileDataRx, entry.rxBytes);
14721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mMobileDataTx, entry.txBytes);
14731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry);
14741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mTotalDataRx, entry.rxBytes);
14751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mTotalDataTx, entry.txBytes);
14761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
14783f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataStart = getCurrentRadioDataUptime();
14793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = 0;
14801059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14813f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
14823f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = getCurrentBluetoothPingCount();
14833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = 0;
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
14866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doPlugLocked(long batteryUptime, long batteryRealtime) {
14871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        NetworkStats.Entry entry = null;
14881059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15031059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
15041059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // Track both mobile and total overall data
15051059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats ifaceStats = getNetworkStatsSummary();
15061059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry, mMobileIfaces);
15071059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mMobileDataRx, entry.rxBytes);
15081059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mMobileDataTx, entry.txBytes);
15091059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry);
15101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mTotalDataRx, entry.rxBytes);
15111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mTotalDataTx, entry.txBytes);
15121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
15133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
15143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataUptime = getRadioDataUptime();
15153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
15163f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
15173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
15183f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = getBluetoothPingCount();
15193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
15229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mWakeLockNesting;
15239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartWakeLocked(int uid, int pid, String name, int type) {
15251ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
15261ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // Only care about partial wake locks, since full wake locks
15271ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // will be canceled when the user puts the screen to sleep.
15281ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
15291ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG;
15301ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: "
15311ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
15321ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
15331ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
15341ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting++;
15359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
15370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
15380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
15390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
15400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type);
15429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
15449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopWakeLocked(int uid, int pid, String name, int type) {
15461ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
15471ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting--;
15481ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
15491ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG;
15501ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: "
15511ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
15521ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
15531ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
15549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
15560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
15570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
15580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
15590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type);
15619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
15639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
15657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
15667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
15677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStartWakeLocked(ws.get(i), pid, name, type);
15687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
15697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
15707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
15717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
15727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
15737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
15747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStopWakeLocked(ws.get(i), pid, name, type);
15757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
15767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
15777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
15780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public int startAddingCpuLocked() {
15790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler.removeMessages(MSG_UPDATE_WAKELOCKS);
15800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (mScreenOn) {
15820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
15830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
15860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (N == 0) {
15870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.clear();
15880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
15890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // How many timers should consume CPU?  Only want to include ones
15920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // that have already been in the list.
15930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
15940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
15950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (st.mInList) {
15960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = st.mUid;
15970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // We don't include the system UID, because it so often
15980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // holds wake locks at one request or another of an app.
15990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null && uid.mUid != Process.SYSTEM_UID) {
16000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    return 50;
16010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
16020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        return 0;
16060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
16070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void finishAddingCpuLocked(int perc, int utime, int stime, long[] cpuSpeedTimes) {
16090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
16100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (perc != 0) {
16110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            int num = 0;
16120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<N; i++) {
16130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                StopwatchTimer st = mPartialTimers.get(i);
16140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (st.mInList) {
16150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid uid = st.mUid;
16160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // We don't include the system UID, because it so often
16170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // holds wake locks at one request or another of an app.
16180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (uid != null && uid.mUid != Process.SYSTEM_UID) {
16190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        num++;
16200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
16210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
16220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (num != 0) {
16240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                for (int i=0; i<N; i++) {
16250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    StopwatchTimer st = mPartialTimers.get(i);
16260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (st.mInList) {
16270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        Uid uid = st.mUid;
16280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        if (uid != null && uid.mUid != Process.SYSTEM_UID) {
1629618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int myUTime = utime/num;
1630618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int mySTime = stime/num;
1631618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            utime -= myUTime;
1632618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            stime -= mySTime;
1633618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            num--;
16340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*");
16350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addCpuTimeLocked(myUTime, mySTime);
16360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addSpeedStepTimes(cpuSpeedTimes);
16370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        }
16380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
16390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
16400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            // Just in case, collect any lost CPU time.
16430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (utime != 0 || stime != 0) {
16440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = getUidStatsLocked(Process.SYSTEM_UID);
16450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null) {
16460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid.Proc proc = uid.getProcessStatsLocked("*lost*");
16470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addCpuTimeLocked(utime, stime);
16480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addSpeedStepTimes(cpuSpeedTimes);
16490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
16500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int NL = mLastPartialTimers.size();
16540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean diff = N != NL;
16550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL && !diff; i++) {
16560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i);
16570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (!diff) {
16590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<NL; i++) {
16600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mPartialTimers.get(i).mInList = true;
16610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return;
16630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL; i++) {
16660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.get(i).mInList = false;
16670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mLastPartialTimers.clear();
16690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
16700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
16710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            st.mInList = true;
16720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.add(st);
16730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
16750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteProcessDiedLocked(int uid, int pid) {
16779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.mPids.remove(pid);
16809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public long getProcessWakeTime(int uid, int pid, long realtime) {
16849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Uid.Pid p = u.mPids.get(pid);
16879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
16889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return p.mWakeSum + (p.mWakeStart != 0 ? (realtime - p.mWakeStart) : 0);
16899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
16909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return 0;
16929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) {
16959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.reportExcessiveWakeLocked(proc, overTime, usedTime);
16989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
17009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1701287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) {
1702287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        Uid u = mUidStats.get(uid);
1703287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        if (u != null) {
1704287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            u.reportExcessiveCpuLocked(proc, overTime, usedTime);
1705287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
1706287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    }
1707287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
17089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mSensorNesting;
17099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
17109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartSensorLocked(int uid, int sensor) {
17119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
17129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG;
17139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: "
17149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
17179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting++;
17189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStartSensor(sensor);
17199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
17209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
17219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopSensorLocked(int uid, int sensor) {
17229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting--;
17239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
17249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG;
17259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: "
17269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
17299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStopSensor(sensor);
17309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
17319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
173232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mGpsNesting;
17335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStartGpsLocked(int uid) {
173532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
17366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG;
173732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: "
173832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
174032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
174132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting++;
17422e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStartGps();
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStopGpsLocked(int uid) {
174632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting--;
174732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
17486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG;
174932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: "
175032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
175232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
17532e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStopGps();
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
17586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG;
175932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: "
176032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
1764617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1765617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this);
1766617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
17679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
17689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // Fake a wake lock, so we consider the device waked as long
17699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // as the screen is on.
17701ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1771c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
1772c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            // Update discharge amounts.
1773c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBatteryInternal) {
177432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                updateDischargeScreenLevelsLocked(false, true);
1775c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
17816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG;
178232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: "
178332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
1787617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1788617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1789617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
17909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
17911ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1792c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
1793c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            // Update discharge amounts.
1794c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBatteryInternal) {
179532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                updateDischargeScreenLevelsLocked(true, false);
1796c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
1797617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1798617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1800617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightnessLocked(int brightness) {
1801617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Bin the brightness.
1802617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
1803617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (bin < 0) bin = 0;
1804617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
1805617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mScreenBrightnessBin != bin) {
18066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK)
18076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT);
180832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: "
180932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1811617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenOn) {
1812617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (mScreenBrightnessBin >= 0) {
1813617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1814617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1815617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[bin].startRunningLocked(this);
1816617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1817617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessBin = bin;
1818617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1819617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
18205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
18214cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate    public void noteInputEventAtomic() {
18224cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        mInputEventCounter.stepAtomic();
1823617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
18245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1825617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivityLocked(int uid, int event) {
18262e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteUserActivityLocked(event);
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
18313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG;
183232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: "
183332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
18423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG;
184332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: "
184432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
185032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
18513bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void stopAllSignalStrengthTimersLocked(int except) {
18525284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
18533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (i == except) {
18543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                continue;
18553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
18563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) {
18573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalStrengthsTimer[i].stopRunningLocked(this);
18583bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
18593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
18603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
18613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1862e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int fixPhoneServiceState(int state, int signalBin) {
1863e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (mPhoneSimStateRaw == TelephonyManager.SIM_STATE_ABSENT) {
1864e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // In this case we will always be STATE_OUT_OF_SERVICE, so need
1865e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // to infer that we are scanning from other data.
1866e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (state == ServiceState.STATE_OUT_OF_SERVICE
18675284090631e638b916d9a453212e9dc802656a67Wink Saville                    && signalBin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
1868e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                state = ServiceState.STATE_IN_SERVICE;
1869e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1870e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1871e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1872e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return state;
1873e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
1874e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1875e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private void updateAllPhoneStateLocked(int state, int simState, int bin) {
18763bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        boolean scanning = false;
1877e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        boolean newHistory = false;
18783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1879e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneServiceStateRaw = state;
1880e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneSimStateRaw = simState;
1881e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneSignalStrengthBinRaw = bin;
1882e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1883e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (simState == TelephonyManager.SIM_STATE_ABSENT) {
1884e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // In this case we will always be STATE_OUT_OF_SERVICE, so need
1885e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // to infer that we are scanning from other data.
1886e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (state == ServiceState.STATE_OUT_OF_SERVICE
18875284090631e638b916d9a453212e9dc802656a67Wink Saville                    && bin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
1888e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                state = ServiceState.STATE_IN_SERVICE;
1889e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1890e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
18913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
18923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If the phone is powered off, stop all timers.
18933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (state == ServiceState.STATE_POWER_OFF) {
1894e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            bin = -1;
1895f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1896e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        // If we are in service, make sure the correct signal string timer is running.
1897e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else if (state == ServiceState.STATE_IN_SERVICE) {
1898e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // Bin will be changed below.
18993bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
19003bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If we're out of service, we are in the lowest signal strength
19013bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // bin and have the scanning bit set.
1902f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        } else if (state == ServiceState.STATE_OUT_OF_SERVICE) {
19033bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            scanning = true;
19045284090631e638b916d9a453212e9dc802656a67Wink Saville            bin = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1905f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalScanningTimer.isRunningLocked()) {
19066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG;
1907e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
19086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: "
19096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1910f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalScanningTimer.startRunningLocked(this);
1911f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1912f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
19135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
19143bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (!scanning) {
19153bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            // If we are no longer scanning, then stop the scanning timer.
19163bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (mPhoneSignalScanningTimer.isRunningLocked()) {
19173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG;
19183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: "
19193bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1920e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
19213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalScanningTimer.stopRunningLocked(this);
19223bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
19233bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
19243bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
192532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mPhoneServiceState != state) {
19266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK)
19276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (state << HistoryItem.STATE_PHONE_STATE_SHIFT);
1928e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + state + " to: "
192932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
1930e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            newHistory = true;
193132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mPhoneServiceState = state;
193232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
1933e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1934e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
1935e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
1936e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
1937e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1938e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (bin >= 0) {
1939e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) {
1940e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1941e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                }
1942e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_SIGNAL_STRENGTH_MASK)
1943e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        | (bin << HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT);
1944e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: "
1945e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1946e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
1947e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            } else {
1948e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                stopAllSignalStrengthTimersLocked(-1);
1949e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1950e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mPhoneSignalStrengthBin = bin;
1951e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1952e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1953e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (newHistory) {
1954e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1955e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1956e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
1957e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1958e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    /**
1959e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * Telephony stack updates the phone state.
1960e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * @param state phone state from ServiceState.getState()
1961e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     */
1962e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    public void notePhoneStateLocked(int state, int simState) {
1963e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        updateAllPhoneStateLocked(state, simState, mPhoneSignalStrengthBinRaw);
196432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
196532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1966e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
1967627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
19685284090631e638b916d9a453212e9dc802656a67Wink Saville        int bin = signalStrength.getLevel();
1969e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        updateAllPhoneStateLocked(mPhoneServiceStateRaw, mPhoneSimStateRaw, bin);
1970627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
19715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1972627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
1973627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
1974627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
1975627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
1976627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
1977627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
1978627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1979627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
1980627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
1981627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1982627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
1983627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
1984627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
19856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_CDMA:
19866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_CDMA;
19876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_0:
19896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_0;
19906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_A:
19926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_A;
19936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_1xRTT:
19956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_1xRTT;
19966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSDPA:
19986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSDPA;
19996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
20006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSUPA:
20016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSUPA;
20026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
20036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSPA:
20046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSPA;
20056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
20066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_IDEN:
20076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_IDEN;
20086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
20096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_B:
20106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_B;
20116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
2012962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                case TelephonyManager.NETWORK_TYPE_LTE:
2013962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    bin = DATA_CONNECTION_LTE;
2014962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    break;
2015962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                case TelephonyManager.NETWORK_TYPE_EHRPD:
2016962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    bin = DATA_CONNECTION_EHRPD;
2017962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    break;
2018627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
2019627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
2020627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
2021627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
2022627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
20233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData);
2024627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
20256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK)
20266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT);
202732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: "
202832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2030627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
2031627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
2032627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
2033627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
2034627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
2035627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2036627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
20375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
203858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOnLocked() {
2039105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
20406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG;
204132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: "
204232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2044105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
2045105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
2046105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2047105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
20485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
204958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOffLocked() {
2050105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
20516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG;
205232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: "
205332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2055105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
2056105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
2057105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2058617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid >= 0) {
205958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked();
2060617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = -1;
2061617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2062105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2063244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2064244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOnLocked(int uid) {
2065244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mAudioOn) {
20666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG;
206732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: "
206832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2070244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = true;
2071244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.startRunningLocked(this);
2072244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20732e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOnLocked();
2074244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
20755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2076244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOffLocked(int uid) {
2077244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mAudioOn) {
20786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG;
207932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: "
208032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2082244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = false;
2083244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.stopRunningLocked(this);
2084244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20852e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOffLocked();
2086244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
2087244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2088244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOnLocked(int uid) {
2089244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mVideoOn) {
20906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG;
209132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: "
209232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2094244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = true;
2095244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.startRunningLocked(this);
2096244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20972e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOnLocked();
2098244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
20995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2100244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOffLocked(int uid) {
2101244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mVideoOn) {
21026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG;
210332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: "
210432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2106244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = false;
2107244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.stopRunningLocked(this);
2108244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
21092e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOffLocked();
2110244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
2111244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
211258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningLocked(WorkSource ws) {
211358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (!mGlobalWifiRunning) {
21146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG;
211532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: "
211632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
211858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = true;
211958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.startRunningLocked(this);
212058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
212158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
212258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiRunningLocked();
212358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
212458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
212558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running");
2126d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
2127d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2128d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
212958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) {
213058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
213158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = oldWs.size();
213258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
213358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked();
213458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
213558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            N = newWs.size();
213658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
213758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked();
213858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
213958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
214058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running");
214158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
214258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
214358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
214458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStoppedLocked(WorkSource ws) {
214558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
21466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RUNNING_FLAG;
214732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: "
214832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
215058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = false;
215158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.stopRunningLocked(this);
215258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
215358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
215458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked();
215558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
215658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
215758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running");
2158d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
2159d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2160d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2161105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
2162105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
21636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG;
216432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: "
216532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2167105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
2168105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
2169105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2170105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
21715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2172105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
2173105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
21746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG;
217532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: "
217632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2178105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
2179105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
2180105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2181105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
21825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
218332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiFullLockNesting = 0;
21845a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2185105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
218632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
21876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
218832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: "
218932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
219132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
219232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting++;
21932e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked();
2194105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2195105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2196105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
219732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting--;
219832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
21996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
220032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: "
220132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
22026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
220332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
22042e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockReleasedLocked();
2205105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2206105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
22076ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    int mWifiScanNesting = 0;
22085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22096ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedLocked(int uid) {
22106ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        if (mWifiScanNesting == 0) {
22116ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_FLAG;
22126ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan started for: "
221332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
22146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
221532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
22166ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        mWifiScanNesting++;
22176ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        getUidStatsLocked(uid).noteWifiScanStartedLocked();
2218105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2219105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
22206ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedLocked(int uid) {
22216ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        mWifiScanNesting--;
22226ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        if (mWifiScanNesting == 0) {
22236ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_FLAG;
22246ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan stopped for: "
222532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
22266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
222732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
22286ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        getUidStatsLocked(uid).noteWifiScanStoppedLocked();
2229105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
22305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
223132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiMulticastNesting = 0;
22325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabledLocked(int uid) {
223432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
22356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
223632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: "
223732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
22386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
223932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
224032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting++;
22412e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastEnabledLocked();
22425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
22435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
22445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabledLocked(int uid) {
224532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting--;
224632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
22476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
224832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: "
224932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
22506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
225132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
22522e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastDisabledLocked();
22535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
22545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
22557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) {
22567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockAcquiredLocked(ws.get(i));
22597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) {
22637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockReleasedLocked(ws.get(i));
22667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22696ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSourceLocked(WorkSource ws) {
22707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22726ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            noteWifiScanStartedLocked(ws.get(i));
22737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22766ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSourceLocked(WorkSource ws) {
22777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22796ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            noteWifiScanStoppedLocked(ws.get(i));
22807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) {
22847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastEnabledLocked(ws.get(i));
22877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) {
22917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastDisabledLocked(ws.get(i));
22947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22971059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    public void noteNetworkInterfaceTypeLocked(String iface, int networkType) {
22981059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        if (ConnectivityManager.isNetworkTypeMobile(networkType)) {
22991059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            mMobileIfaces.add(iface);
23001059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } else {
23011059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            mMobileIfaces.remove(iface);
23021059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
23031059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
23041059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
2306c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which);
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2309617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public long getScreenBrightnessTime(int brightnessBin,
2310617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which) {
2311c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
2312617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                batteryRealtime, which);
2313617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
2314244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2315617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getInputEventCount(int which) {
2316c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mInputEventCounter.getCountLocked(which);
2317617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
23185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
2320c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which);
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2322244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2323627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
2324627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2325c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
2326627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2327627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
2328f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2329f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    @Override public long getPhoneSignalScanningTime(
2330f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            long batteryRealtime, int which) {
2331f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        return mPhoneSignalScanningTimer.getTotalTimeLocked(
2332f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                batteryRealtime, which);
2333f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
2334f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2335617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneSignalStrengthCount(int dataType, int which) {
2336c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2337617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
23385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2339627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
2340627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2341c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
2342627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2343627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
23445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2345617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneDataConnectionCount(int dataType, int which) {
2346c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
23485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2349105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
2350c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which);
2351105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
23525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
235358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) {
235458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2355d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2356d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2357105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
2358c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which);
2359105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
23605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
23735a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
23815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
23865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
238758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        boolean mWifiRunning;
238858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        StopwatchTimer mWifiRunningTimer;
23895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2390105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
2391c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mFullWifiLockTimer;
23925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23936ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        boolean mWifiScanStarted;
23946ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        StopwatchTimer mWifiScanTimer;
23955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23965347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        boolean mWifiMulticastEnabled;
23975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        StopwatchTimer mWifiMulticastTimer;
23985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2399244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mAudioTurnedOn;
2400244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mAudioTurnedOnTimer;
24015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2402244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mVideoTurnedOn;
2403244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mVideoTurnedOnTimer;
24045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
2405617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter[] mUserActivityCounters;
24065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
24265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
24279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        /**
24289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The transient wake stats we have collected for this uid's pids.
24299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         */
24309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        final SparseArray<Pid> mPids = new SparseArray<Pid>();
24319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
243458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
243558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimers, mUnpluggables);
24360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
243758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mFullWifiLockTimers, mUnpluggables);
24386ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
24396ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                    mWifiScanTimers, mUnpluggables);
24400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
244158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiMulticastTimers, mUnpluggables);
24420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
24430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables);
24440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
24455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables);
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2467eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2468eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2472eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2473eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
24796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
24816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
24891059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final long uidRxBytes = getNetworkStatsDetailGroupedByUid().getTotal(
24901059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    null, mUid).rxBytes;
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
24921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    ? (uidRxBytes - mStartedTcpBytesReceived) : 0);
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2494eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2495eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
25016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
25036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2510105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
251158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiRunningLocked() {
251258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (!mWifiRunning) {
251358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = true;
251458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer == null) {
251558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
251658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiRunningTimers, mUnpluggables);
25176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
251858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this);
2519617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2520617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
25215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2522617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
252358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiStoppedLocked() {
252458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunning) {
252558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = false;
252658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this);
2527617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2528617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
25295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2530617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2531105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
2532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
2533105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
25346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer == null) {
25350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
253658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mFullWifiLockTimers, mUnpluggables);
25376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
2538105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
2539105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2542105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2543105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
2544105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
2545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
2546105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
2547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2548105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
25516ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        public void noteWifiScanStartedLocked() {
25526ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (!mWifiScanStarted) {
25536ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanStarted = true;
25546ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                if (mWifiScanTimer == null) {
25556ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                    mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
25566ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                            mWifiScanTimers, mUnpluggables);
25576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25586ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanTimer.startRunningLocked(BatteryStatsImpl.this);
2559105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2560105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2562105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
25636ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        public void noteWifiScanStoppedLocked() {
25646ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (mWifiScanStarted) {
25656ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanStarted = false;
25666ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanTimer.stopRunningLocked(BatteryStatsImpl.this);
2567105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2568105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
25715347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastEnabledLocked() {
25725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (!mWifiMulticastEnabled) {
25735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = true;
25746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer == null) {
25750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
257658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiMulticastTimers, mUnpluggables);
25776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this);
25795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
25805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
25815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
25835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastDisabledLocked() {
25845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (mWifiMulticastEnabled) {
25855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = false;
25865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this);
25875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
25885347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
25895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOnLocked() {
25926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mAudioTurnedOn) {
25936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = true;
25946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer == null) {
25950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
25966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
25976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
25996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2600617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2601244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
26026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
26036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOffLocked() {
26046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOn) {
26056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = false;
26066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
26076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
26096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
26106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
26116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOnLocked() {
26126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mVideoTurnedOn) {
26136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = true;
26146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer == null) {
26150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
26166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
26176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
26186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
26196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
26216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
26226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
26236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOffLocked() {
26246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOn) {
26256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = false;
26266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
26276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2628244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2629244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
26305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
263158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public long getWifiRunningTime(long batteryRealtime, int which) {
263258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer == null) {
26336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
263558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2636244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2637244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
26385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
2639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
26406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer == null) {
26416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
2644105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
26455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
26465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
26476ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        public long getWifiScanTime(long batteryRealtime, int which) {
26486ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (mWifiScanTimer == null) {
26496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26516ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            return mWifiScanTimer.getTotalTimeLocked(batteryRealtime, which);
2652105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
26535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
26545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
26555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public long getWifiMulticastTime(long batteryRealtime, int which) {
26566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer == null) {
26576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26595347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime,
26605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                          which);
26615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
26625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
26635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
26646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getAudioTurnedOnTime(long batteryRealtime, int which) {
26656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer == null) {
26666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
26696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
26706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
26715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
26726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getVideoTurnedOnTime(long batteryRealtime, int which) {
26736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer == null) {
26746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
26776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
26786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
2679617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2680617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteUserActivityLocked(int type) {
2681617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2682617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                initUserActivityLocked();
2683617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2684617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (type < 0) type = 0;
2685617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1;
26864cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUserActivityCounters[type].stepAtomic();
2687617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2689617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2690617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
2691617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
2692617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2694617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2695617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
2696617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2697617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
2698617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
2700617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
27015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2702617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
2703617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2704617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2705617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
2706617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2707617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
27085a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
27101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final long uidTxBytes = getNetworkStatsDetailGroupedByUid().getTotal(
27111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    null, mUid).txBytes;
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
27131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    ? (uidTxBytes - mStartedTcpBytesSent) : 0);
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2715244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
27166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
27176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear all stats for this uid.  Returns true if the uid is completely
27186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * inactive so can be dropped.
27196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
27206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        boolean reset() {
27216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean active = false;
27225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
272358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
272458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false);
272558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= mWifiRunning;
27266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
27289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false);
27296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mFullWifiLockOut;
27306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27316ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (mWifiScanTimer != null) {
27326ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                active |= !mWifiScanTimer.reset(BatteryStatsImpl.this, false);
27336ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                active |= mWifiScanStarted;
27346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
27369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false);
27376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mWifiMulticastEnabled;
27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
27409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false);
27416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mAudioTurnedOn;
27426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
27449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false);
27456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mVideoTurnedOn;
27466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0;
27496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0;
27505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
27526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
27536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUserActivityCounters[i].reset(false);
27546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
27576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWakelockStats.size() > 0) {
27586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator();
27596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Wakelock> wakelockEntry = it.next();
27616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Wakelock wl = wakelockEntry.getValue();
27626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (wl.reset()) {
27636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
27646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
27656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
27666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mSensorStats.size() > 0) {
27706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator();
27716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<Integer, Sensor> sensorEntry = it.next();
27736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Sensor s = sensorEntry.getValue();
27746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (s.reset()) {
27756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
27766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
27776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
27786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mProcessStats.size() > 0) {
27826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator();
27836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Proc> procEntry = it.next();
27856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    procEntry.getValue().detach();
27866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mProcessStats.clear();
27886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mPids.size() > 0) {
27909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; !active && i<mPids.size(); i++) {
27919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    Pid pid = mPids.valueAt(i);
27929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    if (pid.mWakeStart != 0) {
27939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        active = true;
27949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    }
27959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
27969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
27976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mPackageStats.size() > 0) {
27986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator();
27996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
28006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Pkg> pkgEntry = it.next();
28016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Pkg p = pkgEntry.getValue();
28026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    p.detach();
28036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (p.mServiceStats.size() > 0) {
28046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        Iterator<Map.Entry<String, Pkg.Serv>> it2
28056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                                = p.mServiceStats.entrySet().iterator();
28066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        while (it2.hasNext()) {
28076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            Map.Entry<String, Pkg.Serv> servEntry = it2.next();
28086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            servEntry.getValue().detach();
28096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
28106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
28116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mPackageStats.clear();
28136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPids.clear();
28169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
28176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!active) {
281858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer != null) {
281958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer.detach();
28206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer != null) {
28226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mFullWifiLockTimer.detach();
28236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28246ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                if (mWifiScanTimer != null) {
28256ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                    mWifiScanTimer.detach();
28266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer != null) {
28286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mWifiMulticastTimer.detach();
28296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer != null) {
28316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mAudioTurnedOnTimer.detach();
28326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer != null) {
28346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mVideoTurnedOnTimer.detach();
28356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mUserActivityCounters != null) {
28376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
28386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUserActivityCounters[i].detach();
28396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
28406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return !active;
28446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
28455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
288158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
28826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
288358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.writeToParcel(out, batteryRealtime);
28846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
2885617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
28866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
28886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
2890617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
28916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28936ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (mWifiScanTimer != null) {
28946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28956ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanTimer.writeToParcel(out, batteryRealtime);
28966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
29006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
29016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer.writeToParcel(out, batteryRealtime);
29026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
29046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
29066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
29076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime);
29086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
29106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
29126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
29136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime);
29146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
29166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
2918617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
2919617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2920617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
2921617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
29226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
2924617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
2934c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                // We will just drop some random set of wakelocks if
2935c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                // the previous run of the system was an older version
2936c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                // that didn't impose a limit.
2937c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                mWakelockStats.put(wakelockName, wakelock);
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
297358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunning = false;
29746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
297558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
297658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiRunningTimers, mUnpluggables, in);
29776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
297858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = null;
29796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2980105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
29816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
298358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mFullWifiLockTimers, mUnpluggables, in);
29846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer = null;
29866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29876ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mWifiScanStarted = false;
29886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29896ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
29906ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                        mWifiScanTimers, mUnpluggables, in);
29916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29926ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanTimer = null;
29936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29945347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastEnabled = false;
29956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
299758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiMulticastTimers, mUnpluggables, in);
2998617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
29996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer = null;
30006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mAudioTurnedOn = false;
30026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
30030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
30046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
30056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
30066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer = null;
30076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mVideoTurnedOn = false;
30096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
30100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
30116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
30126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
30136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer = null;
30146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
3016617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
3017617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
3018617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
3019617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
30206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
30216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUserActivityCounters = null;
3022617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3032c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3037c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3051c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, type, pool, unpluggables, in);
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
30616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                boolean wlactive = false;
30626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerFull != null) {
30639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false);
30646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerPartial != null) {
30669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false);
30676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerWindow != null) {
30699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false);
30706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (!wlactive) {
30726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerFull != null) {
30736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull.detach();
30746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull = null;
30756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerPartial != null) {
30776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial.detach();
30786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial = null;
30796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerWindow != null) {
30816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow.detach();
30826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow = null;
30836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return !wlactive;
30866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30875a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
3116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
31175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3122c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
3130c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in);
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
31379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (mTimer.reset(BatteryStatsImpl.this, true)) {
31386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mTimer = null;
31396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return true;
31406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
31416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return false;
31426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
31435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3156eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3157eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3183eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Amount of time the process was running in the foreground.
3184eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3185eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mForegroundTime;
3186eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3187eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3203eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from a previous save.
3204eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3205eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLoadedForegroundTime;
3206eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3207eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3223eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from the previous run
3224eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3225eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLastForegroundTime;
3226eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3227eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3242eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
3243eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time since unplugged.
3244eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3245eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mUnpluggedForegroundTime;
3246eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3247e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            SamplingCounter[] mSpeedBins;
3248e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3249287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            ArrayList<ExcessivePower> mExcessivePower;
32509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
3253e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[getCpuSpeedSteps()];
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3255e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
3260eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = mForegroundTime;
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
32666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
32676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
32686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i = 0; i < mSpeedBins.length; i++) {
32696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
32706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
32716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUnpluggables.remove(c);
32726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = null;
32736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
32746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
32756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
32765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3277287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public int countExcessivePowers() {
3278287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                return mExcessivePower != null ? mExcessivePower.size() : 0;
32799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3281287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public ExcessivePower getExcessivePower(int i) {
3282287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower != null) {
3283287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    return mExcessivePower.get(i);
32849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return null;
32869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            public void addExcessiveWake(long overTime, long usedTime) {
3289287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3290287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
32919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
3292287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3293287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_WAKE;
32949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.overTime = overTime;
32959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.usedTime = usedTime;
3296287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
32979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3299287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public void addExcessiveCpu(long overTime, long usedTime) {
3300287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3301287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
3302287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                }
3303287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3304287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_CPU;
3305287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.overTime = overTime;
3306287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.usedTime = usedTime;
3307287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
3308287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
3309287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
3310287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            void writeExcessivePowerToParcelLocked(Parcel out) {
3311287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
33129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeInt(0);
33139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    return;
33149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3316287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                final int N = mExcessivePower.size();
33179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                out.writeInt(N);
33189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3319287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = mExcessivePower.get(i);
3320287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    out.writeInt(ew.type);
33219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.overTime);
33229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.usedTime);
33239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
33259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
33267b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            boolean readExcessivePowerFromParcelLocked(Parcel in) {
33279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                final int N = in.readInt();
33289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (N == 0) {
3329287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = null;
33307b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return true;
33319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
33337b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (N > 10000) {
33347b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many excessive power entries " + N);
33357b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return false;
33367b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
33377b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn
3338287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower = new ArrayList<ExcessivePower>();
33399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3340287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = new ExcessivePower();
3341287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ew.type = in.readInt();
33429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.overTime = in.readLong();
33439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.usedTime = in.readLong();
3344287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower.add(ew);
33459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33467b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                return true;
33479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
33489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
3352eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mForegroundTime);
33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
3356eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLoadedForegroundTime);
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
3360eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mUnpluggedForegroundTime);
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
3362e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3363e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                out.writeInt(mSpeedBins.length);
3364e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
33656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
33666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
33676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(1);
33686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.writeToParcel(out);
33696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
33706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(0);
33716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3372e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
33739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3374287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                writeExcessivePowerToParcelLocked(out);
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
3380eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime = in.readLong();
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
3384eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLoadedForegroundTime = in.readLong();
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
33863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastUserTime = 0;
33873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastSystemTime = 0;
33883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastForegroundTime = 0;
33893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastStarts = 0;
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
3392eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = in.readLong();
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
3394e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3395e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                int bins = in.readInt();
33966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                int steps = getCpuSpeedSteps();
33976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps];
3398e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < bins; i++) {
33996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (in.readInt() != 0) {
34006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = new SamplingCounter(mUnpluggables, in);
34016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3402e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
34039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3404287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                readExcessivePowerFromParcelLocked(in);
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3416eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public void addForegroundTimeLocked(long ttime) {
3417eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime += ttime;
3418eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3419eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
34336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
34496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
3457eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public long getForegroundTime(int which) {
3458eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                long val;
3459eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                if (which == STATS_LAST) {
3460eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mLastForegroundTime;
3461eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                } else {
3462eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mForegroundTime;
3463eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    if (which == STATS_CURRENT) {
3464eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mLoadedForegroundTime;
34656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
3466eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mUnpluggedForegroundTime;
3467eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    }
3468eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                }
3469eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                return val;
3470eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3471eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3472eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
34816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3487e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3488e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /* Called by ActivityManagerService when CPU times are updated. */
3489e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public void addSpeedStepTimes(long[] values) {
3490e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length && i < values.length; i++) {
34916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    long amt = values[i];
34926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (amt != 0) {
34936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        SamplingCounter c = mSpeedBins[i];
34946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        if (c == null) {
34956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            mSpeedBins[i] = c = new SamplingCounter(mUnpluggables);
34966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
34976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.addCountAtomic(values[i]);
34986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3499e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3500e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
3501e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3502e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            @Override
3503e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public long getTimeAtCpuSpeedStep(int speedStep, int which) {
3504e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                if (speedStep < mSpeedBins.length) {
35056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[speedStep];
35066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return c != null ? c.getCountLocked(which) : 0;
3507e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                } else {
3508e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return 0;
3509e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3510e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
35586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
35596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
35605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
35643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastWakeups = 0;
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
36066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
37216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                void detach() {
37226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUnpluggables.remove(this);
37236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
37245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
37373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStartTime = 0;
37383bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStarts = 0;
37393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastLaunches = 0;
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
38266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
38436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
38606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3896b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        public SparseArray<? extends Pid> getPidStats() {
3897b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            return mPids;
3898b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        }
38995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
39009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public Pid getPidStatsLocked(int pid) {
39019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Pid p = mPids.get(pid);
39029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p == null) {
39039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p = new Pid();
39049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mPids.put(pid, p);
39059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
39069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return p;
39079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
39089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3938c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
3941c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                final int N = mWakelockStats.size();
3942c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                if (N > MAX_WAKELOCKS_PER_UID && (mUid != Process.SYSTEM_UID
3943c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        || N > MAX_WAKELOCKS_PER_UID_IN_SYSTEM)) {
39449e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    name = BATCHED_WAKELOCK_NAME;
39459e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = mWakelockStats.get(name);
39469e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
39479e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (wl == null) {
39489e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = new Wakelock();
39499e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(name, wl);
39509e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3952c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL,
39580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mPartialTimers, mUnpluggables);
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
39609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL,
39660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mFullTimers, mUnpluggables);
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW,
39740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mWindowTimers, mUnpluggables);
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3983c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
39849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
39889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3992c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3996c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
3998c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables);
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
40039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStartWakeLocked(int pid, String name, int type) {
4007c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40111ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
40129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = getPidStatsLocked(pid);
4013b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p.mWakeStart == 0) {
4014b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                    p.mWakeStart = SystemClock.elapsedRealtime();
4015b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                }
40169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStopWakeLocked(int pid, String name, int type) {
4020c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40241ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
40259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = mPids.get(pid);
4026b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p != null && p.mWakeStart != 0) {
40279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart;
40289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeStart = 0;
40299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
40309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
40319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
40329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
40339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) {
40349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Proc p = getProcessStatsLocked(proc);
40359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
40369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p.addExcessiveWake(overTime, usedTime);
40379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4040287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) {
4041287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            Proc p = getProcessStatsLocked(proc);
4042287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            if (p != null) {
4043287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                p.addExcessiveCpu(overTime, usedTime);
4044287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
4045287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
4046287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
4048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
4056c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
40595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
4063c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
4070c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
4073244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
40821afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = new JournaledFile(new File(filename), new File(filename + ".tmp"));
40830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = new MyHandler();
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
40850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables);
4086617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
40870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables);
4088617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4089617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
40900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables);
40915284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
40920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables);
4093627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
40940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables);
4095627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
40960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables);
4097627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
40980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables);
409958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables);
41000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables);
41010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables);
41020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables);
41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
41046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
4111633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
41126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = 0;
4113633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
4114c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
41150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
41191afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
41200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
41210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void setCallback(BatteryCallback cb) {
41260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mCallback = cb;
41270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
41280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
4129e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public void setNumSpeedSteps(int steps) {
4130e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (sNumSpeedSteps == 0) sNumSpeedSteps = steps;
4131e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4132e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4133f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void setRadioScanningTimeout(long timeout) {
4134f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneSignalScanningTimer != null) {
4135f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.setTimeout(timeout);
4136f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
4137f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
4138f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
41390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingOldHistoryLocked() {
41410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
41420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
41430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
41441fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        mHistoryReadTmp.clear();
41450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
41460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
4147ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return (mHistoryIterator = mHistory) != null;
4148ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4149ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
41500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextOldHistoryLocked(HistoryItem out) {
41520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize();
41530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!end) {
41541fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mHistoryReadTmp.readDelta(mHistoryBuffer);
41551fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW;
41560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4157ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        HistoryItem cur = mHistoryIterator;
4158ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (cur == null) {
41590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (!mReadOverflow && !end) {
41600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "Old history ends before new history!");
41610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
4162ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return false;
4163ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4164ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        out.setTo(cur);
4165ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mHistoryIterator = cur.next;
41660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!mReadOverflow) {
41670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (end) {
41680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "New history ends before old history!");
41691fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else if (!out.same(mHistoryReadTmp)) {
41700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
41710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                PrintWriter pw = new PrintWriter(new LogWriter(android.util.Log.WARN, TAG));
41720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Histories differ!");
41730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Old history:");
41740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, out, now);
41750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("New history:");
41761fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, now);
41770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
41780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4179ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return true;
4180ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4181ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
41830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingOldHistoryLocked() {
41840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
41850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
41860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingHistoryLocked() {
41900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
41910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
41920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
41930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
41940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
41950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return mHistoryBuffer.dataSize() > 0;
41960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextHistoryLocked(HistoryItem out) {
42001fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        final int pos = mHistoryBuffer.dataPosition();
42011fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        if (pos == 0) {
42021fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            out.clear();
42031fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        }
42041fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        boolean end = pos >= mHistoryBuffer.dataSize();
42050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (end) {
42060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return false;
42070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
42080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
42091fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        out.readDelta(mHistoryBuffer);
42100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return true;
42110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
42120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
42130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
42140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingHistoryLocked() {
42150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
42160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
421732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
42185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
421932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    @Override
4220b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    public long getHistoryBaseTime() {
4221b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        return mHistoryBaseTime;
4222b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    }
42235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4224b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    @Override
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
42279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
42309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public boolean isScreenOn() {
42349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return mScreenOn;
42359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
42369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
42376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void initTimes() {
42386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryRealtime = mTrackBatteryPastUptime = 0;
42396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryUptime = mTrackBatteryPastRealtime = 0;
42406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
42416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
42426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
42436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
42446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
42455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4246c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    void initDischarge() {
4247c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mLowDischargeAmountSinceCharge = 0;
4248c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mHighDischargeAmountSinceCharge = 0;
4249c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = 0;
4250c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = 0;
4251c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = 0;
4252c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = 0;
4253c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4254c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
42556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void resetAllStatsLocked() {
42566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mStartCount = 0;
42576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
42589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mScreenOnTimer.reset(this, false);
42596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
42609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mScreenBrightnessTimer[i].reset(this, false);
42616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mInputEventCounter.reset(false);
42639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneOnTimer.reset(this, false);
42649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mAudioOnTimer.reset(this, false);
42659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mVideoOnTimer.reset(this, false);
42665284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
42679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneSignalStrengthsTimer[i].reset(this, false);
42686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneSignalScanningTimer.reset(this, false);
42706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
42719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneDataConnectionsTimer[i].reset(this, false);
42726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mWifiOnTimer.reset(this, false);
427458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.reset(this, false);
42759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mBluetoothOnTimer.reset(this, false);
42765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<mUidStats.size(); i++) {
42786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUidStats.valueAt(i).reset()) {
42796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUidStats.remove(mUidStats.keyAt(i));
42806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                i--;
42816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
42826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mKernelWakelockStats.size() > 0) {
42856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            for (SamplingTimer timer : mKernelWakelockStats.values()) {
42866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(timer);
42876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
42886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mKernelWakelockStats.clear();
42896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4291c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
42925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        clearHistoryLocked();
42946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
42955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
429632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) {
4297c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (oldScreenOn) {
4298c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel;
4299c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4300c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOn += diff;
4301c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOnSinceCharge += diff;
4302c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4303c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4304c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel;
4305c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4306c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOff += diff;
4307c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOffSinceCharge += diff;
4308c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4309c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4310c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (newScreenOn) {
4311c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel;
4312c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = 0;
4313c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4314c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = 0;
4315c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel;
4316c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4317c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4318c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
43196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void setOnBattery(boolean onBattery, int oldStatus, int level) {
43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
432132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            setOnBatteryLocked(onBattery, oldStatus, level);
432232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
432332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    }
432432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
432532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void setOnBatteryLocked(boolean onBattery, int oldStatus, int level) {
432632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        boolean doWrite = false;
432732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE);
432832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        m.arg1 = onBattery ? 1 : 0;
432932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mHandler.sendMessage(m);
433032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mOnBattery = mOnBatteryInternal = onBattery;
433132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
433232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long uptime = SystemClock.uptimeMillis() * 1000;
433332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long mSecRealtime = SystemClock.elapsedRealtime();
433432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long realtime = mSecRealtime * 1000;
433532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (onBattery) {
433632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // We will reset our status if we are unplugging after the
433732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // battery was last full, or the level is at 100, or
433832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // we have gone through a significant charge (from a very low
433932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // level to a now very high level).
434032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (oldStatus == BatteryManager.BATTERY_STATUS_FULL
434132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || level >= 90
434232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || (mDischargeCurrentLevel < 20 && level >= 80)) {
434332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                doWrite = true;
434432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                resetAllStatsLocked();
434532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeStartLevel = level;
434632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
434732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
434832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
434932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
435032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: "
435132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
435232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
435332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryUptimeStart = uptime;
435432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryRealtimeStart = realtime;
435532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
435632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
435732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = mDischargeUnplugLevel = level;
435832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mScreenOn) {
435932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = level;
436032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = 0;
43616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
436232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = 0;
436332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = level;
43646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
436532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOn = 0;
436632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOff = 0;
436732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
436832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        } else {
436932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
437032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
437132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
437232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: "
437332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
437432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
437532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
437632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
437732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = level;
437832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (level < mDischargeUnplugLevel) {
437932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;
438032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level;
438132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
438232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn);
438332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
438432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
438532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) {
438632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mFile != null) {
438732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                writeAsyncLocked();
43889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
43926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // This should probably be exposed in the API, though it's not critical
43936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    private static final int BATTERY_PLUGGED_NONE = 0;
43945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
43956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void setBatteryState(int status, int health, int plugType, int level,
43966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int temp, int volt) {
439732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        synchronized(this) {
439832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
439932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            int oldStatus = mHistoryCur.batteryStatus;
440032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!mHaveBatteryLevel) {
440132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHaveBatteryLevel = true;
440232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We start out assuming that the device is plugged in (not
440332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // on battery).  If our first report is now that we are indeed
440432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // plugged in, then twiddle our state to correctly reflect that
440532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // since we won't be going through the full setOnBattery().
440632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (onBattery == mOnBattery) {
440732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    if (onBattery) {
440832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
440932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    } else {
441032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
441132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    }
44126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
441332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                oldStatus = status;
44146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
441532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery) {
441632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeCurrentLevel = level;
441732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = true;
44186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
441932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery != mOnBattery) {
442032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHistoryCur.batteryLevel = (byte)level;
44216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryStatus = (byte)status;
44226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryHealth = (byte)health;
44236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryPlugType = (byte)plugType;
44246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryTemperature = (char)temp;
44256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryVoltage = (char)volt;
442632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                setOnBatteryLocked(onBattery, oldStatus, level);
442732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            } else {
442832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                boolean changed = false;
442932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryLevel != level) {
443032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryLevel = (byte)level;
443132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
443232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
443332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryStatus != status) {
443432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryStatus = (byte)status;
443532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
443632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
443732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryHealth != health) {
443832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryHealth = (byte)health;
443932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
444032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
444132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryPlugType != plugType) {
444232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryPlugType = (byte)plugType;
444332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
444432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
444532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (temp >= (mHistoryCur.batteryTemperature+10)
444632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || temp <= (mHistoryCur.batteryTemperature-10)) {
444732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryTemperature = (char)temp;
444832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
444932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
445032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (volt > (mHistoryCur.batteryVoltage+20)
445132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || volt < (mHistoryCur.batteryVoltage-20)) {
445232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryVoltage = (char)volt;
445332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
445432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
445532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (changed) {
445632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    addHistoryRecordLocked(SystemClock.elapsedRealtime());
445732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
44586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
445932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
446032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We don't record history while we are plugged in and fully charged.
446132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // The next time we are unplugged, history will be cleared.
446232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = false;
44636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
44646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4465633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
44665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4467c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
4468c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
44695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4470d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        if (m == null) {
4471d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            // Not crashing might make board bringup easier.
44721afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "Couldn't get kernel wake lock stats");
4473d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            return;
4474d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        }
4475d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen
4476c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
4477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
4478c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
44795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
4481c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
44825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
4483c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
4484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
4485c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4486c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
4487c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
4488c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
4489c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
44905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
4492c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
4493c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
4494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
4495c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
4496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
4497c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
4498c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4499c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4500c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
45019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
45039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
45049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart);
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
45166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart);
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
45276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
45416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
45566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
45659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
45689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
45719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
45779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
45819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
45859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
45899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45913718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45923718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long getTcpBytes(long current, long[] dataBytes, int which) {
45933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (which == STATS_LAST) {
45943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return dataBytes[STATS_LAST];
45953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
45966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (which == STATS_SINCE_UNPLUGGED) {
45976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) {
45983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return dataBytes[STATS_LAST];
45993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                } else {
46006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return current - dataBytes[STATS_SINCE_UNPLUGGED];
46013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                }
46026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else if (which == STATS_SINCE_CHARGED) {
46036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED];
46043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            }
46053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return current - dataBytes[STATS_CURRENT];
46063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
46073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
46093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
46103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesSent(int which) {
46111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long mobileTxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).txBytes;
46121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(mobileTxBytes, mMobileDataTx, which);
46133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
46153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
46163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesReceived(int which) {
46171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long mobileRxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).rxBytes;
46181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(mobileRxBytes, mMobileDataRx, which);
46193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
46213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
46223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesSent(int which) {
46231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long totalTxBytes = getNetworkStatsSummary().getTotal(null).txBytes;
46241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(totalTxBytes, mTotalDataTx, which);
46253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
46273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
46283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesReceived(int which) {
46291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long totalRxBytes = getNetworkStatsSummary().getTotal(null).rxBytes;
46301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(totalRxBytes, mTotalDataRx, which);
46313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46323718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
4633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4634633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
4635105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4636633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
4637105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4638105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4640633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
46416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mDischargeUnplugLevel;
4642105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4644105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4645633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
4646105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4647633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
4648105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4649105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4651633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
4652e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return mDischargeCurrentLevel;
4653105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4655e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    @Override
46563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getLowDischargeAmountSinceCharge() {
46573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4658e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mLowDischargeAmountSinceCharge;
4659e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4660e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel-1;
4661e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4662e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
46633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
46643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
46653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
46663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
46673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getHighDischargeAmountSinceCharge() {
46683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4669e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mHighDischargeAmountSinceCharge;
4670e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4671e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel;
4672e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4673e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
46743bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
46753bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
4676c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4677c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOn() {
4678c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4679c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOn;
4680c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4681c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4682c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4683c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4684c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4685c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4686c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4687c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4688c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOnSinceCharge() {
4689c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4690c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOnSinceCharge;
4691c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4692c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4693c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4694c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4695c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4696c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4697c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4698c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4699c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOff() {
4700c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4701c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOff;
4702c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4703c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4704c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4705c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4706c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4707c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4708c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4709c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4710c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOffSinceCharge() {
4711c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4712c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOffSinceCharge;
4713c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4714c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4715c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4716c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4717c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4718c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4719c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
47203bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
47213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
4722e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public int getCpuSpeedSteps() {
4723e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return sNumSpeedSteps;
4724e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4725e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
47289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
47309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
47319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
47329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
47339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
47369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
474432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
475532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * Retrieve the statistics object for a particular process, given
475632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * the name of the process.
475732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @param name process name
475832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @return the statistics object for the process
475932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     */
4760819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public Uid.Proc getProcessStatsLocked(String name, int pid) {
476132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        int uid;
476232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (mUidCache.containsKey(name)) {
476332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            uid = mUidCache.get(name);
476432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        } else {
4765819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani            uid = Process.getUidForPid(pid);
476632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            mUidCache.put(name, uid);
476732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
476832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        Uid u = getUidStatsLocked(uid);
476932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        return u.getProcessStatsLocked(name);
477032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
477132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
477232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    /**
47739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
47749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
47779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
47799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
47839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
47869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
47889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    /**
479158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * Massage data to distribute any reasonable work down to more specific
479258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * owners.  Must only be called on a dead BatteryStats object!
479358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     */
479458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void distributeWorkLocked(int which) {
479558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        // Aggregate all CPU time associated with WIFI.
479658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        Uid wifiUid = mUidStats.get(Process.WIFI_UID);
479758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (wifiUid != null) {
479858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which);
479958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (Uid.Proc proc : wifiUid.mProcessStats.values()) {
480058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which);
480158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<mUidStats.size(); i++) {
480258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    Uid uid = mUidStats.valueAt(i);
480358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (uid.mUid != Process.WIFI_UID) {
480458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        long uidRunningTime = uid.getWifiRunningTime(uSecTime, which);
480558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (uidRunningTime > 0) {
480658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*");
480758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            long time = proc.getUserTime(which);
480858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
480958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mUserTime += time;
481058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mUserTime -= time;
481158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getSystemTime(which);
481258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
481358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mSystemTime += time;
481458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mSystemTime -= time;
481558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getForegroundTime(which);
481658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
481758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mForegroundTime += time;
481858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mForegroundTime -= time;
481958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            for (int sb=0; sb<proc.mSpeedBins.length; sb++) {
482058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                SamplingCounter sc = proc.mSpeedBins[sb];
482158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                if (sc != null) {
482258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = sc.getCountLocked(which);
482358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = (time*uidRunningTime)/totalRunningTime;
482458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    SamplingCounter uidSc = uidProc.mSpeedBins[sb];
482558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    if (uidSc == null) {
482658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidSc = new SamplingCounter(mUnpluggables);
482758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidProc.mSpeedBins[sb] = uidSc;
482858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    }
482958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    uidSc.mCount.addAndGet((int)time);
483058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    sc.mCount.addAndGet((int)-time);
483158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                }
483258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            }
483358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            totalRunningTime -= uidRunningTime;
483458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
483558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
483658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
483758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
483858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
483958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
484058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
48416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void shutdownLocked() {
4842ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSyncLocked();
48436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mShuttingDown = true;
48441afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    }
48455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4846ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    Parcel mPendingWrite = null;
4847ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    final ReentrantLock mWriteLock = new ReentrantLock();
4848ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4849ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeAsyncLocked() {
4850ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(false);
4851ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4852ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4853ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeSyncLocked() {
4854ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(true);
4855ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4856ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4857ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    void writeLocked(boolean sync) {
48581afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
48591afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "writeLocked: no file associated with this instance");
48609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
48619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mShuttingDown) {
48646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
48656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
48665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4867ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        Parcel out = Parcel.obtain();
4868ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSummaryToParcel(out);
4869ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mLastWriteTime = SystemClock.elapsedRealtime();
4870ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4871ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mPendingWrite != null) {
4872ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite.recycle();
4873ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4874ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mPendingWrite = out;
4875ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4876ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (sync) {
4877ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            commitPendingDataToDisk();
4878ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } else {
4879ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            Thread thr = new Thread("BatteryStats-Write") {
4880ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                @Override
4881ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                public void run() {
4882ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4883ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    commitPendingDataToDisk();
4884ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                }
4885ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            };
4886ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            thr.start();
4887ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4888ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4889ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4890ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void commitPendingDataToDisk() {
4891f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        final Parcel next;
4892ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        synchronized (this) {
4893ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next = mPendingWrite;
4894ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite = null;
4895f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            if (next == null) {
4896f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                return;
4897f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            }
4898ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4899ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.lock();
4900ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4901ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
49029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
49031afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite());
4904ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            stream.write(next.marshall());
49059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
49068bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn            FileUtils.sync(stream);
49079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
49081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            mFile.commit();
49099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
49101afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "Error writing battery statistics", e);
4911ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mFile.rollback();
4912ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } finally {
4913ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next.recycle();
4914ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.unlock();
49159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
49199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
49209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
49259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
49289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
49299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
49309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
49329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
49339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
49349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
49359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
49369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
49421afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
49431afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readLocked: no file associated with this instance");
49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
49459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
49489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
49501afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            File file = mFile.chooseForRead();
49511afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (!file.exists()) {
49521afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
49539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49541afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileInputStream stream = new FileInputStream(file);
49559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
49579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
49589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
49599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
49609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
49619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
49641afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.e("BatteryStats", "Error reading battery statistics", e);
49659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long now = SystemClock.elapsedRealtime();
4968e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (USE_OLD_HISTORY) {
4969e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            addHistoryRecordLocked(now, HistoryItem.CMD_START);
4970e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
49710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(now, HistoryItem.CMD_START);
49729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
49759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4978ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    void readHistory(Parcel in, boolean andOldHistory) {
4979ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        final long historyBaseTime = in.readLong();
49800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
49810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataSize(0);
49820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
49830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
49840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int bufSize = in.readInt();
49850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int curPos = in.dataPosition();
49860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) {
49870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer too large " + bufSize);
49880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else if ((bufSize&~3) != bufSize) {
49890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer not aligned " + bufSize);
49900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else {
49910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (DEBUG_HISTORY) Slog.i(TAG, "***************** READING NEW HISTORY: " + bufSize
49920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    + " bytes at " + curPos);
49930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.appendFrom(in, curPos, bufSize);
49940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            in.setDataPosition(curPos + bufSize);
499532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
49965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4997ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (andOldHistory) {
4998ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            readOldHistory(in);
4999ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5000ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
5001ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
5002ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
5003ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** OLD mHistoryBaseTime: ");
5004ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
5005ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
5006ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5007ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        mHistoryBaseTime = historyBaseTime;
5008ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
5009ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
5010ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** NEW mHistoryBaseTime: ");
5011ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
5012ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
5013ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5014ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
5015ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        // We are just arbitrarily going to insert 1 minute from the sample of
5016ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        // the last run until samples in this run.
5017ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (mHistoryBaseTime > 0) {
5018ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            long oldnow = SystemClock.elapsedRealtime();
5019ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            mHistoryBaseTime = (mHistoryBaseTime - oldnow) + 60*1000;
5020ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            if (DEBUG_HISTORY) {
5021ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                StringBuilder sb = new StringBuilder(128);
5022ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                sb.append("****************** ADJUSTED mHistoryBaseTime: ");
5023ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                TimeUtils.formatDuration(mHistoryBaseTime, sb);
5024ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                Slog.i(TAG, sb.toString());
5025ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            }
50261e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn        }
502732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
50285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void readOldHistory(Parcel in) {
5030e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
5031e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
5032e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
50330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistory = mHistoryEnd = mHistoryCache = null;
50340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long time;
50355e3357fcee2a23a08434873a89e8ada4c6e6d893Conley Owens        while (in.dataAvail() > 0 && (time=in.readLong()) >= 0) {
50360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            HistoryItem rec = new HistoryItem(time, in);
50370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            addHistoryRecordLocked(rec);
50380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
50390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
50400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
5041ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    void writeHistory(Parcel out, boolean andOldHistory) {
5042ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
5043ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
5044ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** WRITING mHistoryBaseTime: ");
5045ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
5046ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append(" mLastHistoryTime: ");
5047ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mLastHistoryTime, sb);
5048ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
5049ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5050ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        out.writeLong(mHistoryBaseTime + mLastHistoryTime);
50510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.writeInt(mHistoryBuffer.dataSize());
50520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: "
50530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition());
50540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize());
5055ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
5056ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (andOldHistory) {
5057ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            writeOldHistory(out);
5058ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
50590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
50600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
50610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void writeOldHistory(Parcel out) {
5062e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
5063e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
5064e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
50656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistory;
506632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        while (rec != null) {
506732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (rec.time >= 0) rec.writeToParcel(out, 0);
506832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            rec = rec.next;
506932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
507032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        out.writeLong(-1);
507132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
50725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
50761afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readFromParcel: version got " + version
50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
50799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5081ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        readHistory(in, true);
50825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
50849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
50859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
50869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
50879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
50886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5089633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
50903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
50913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
5092c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
5093c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
50945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
50965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
5099617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5100617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
5101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5102617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
51049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
51055284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5106627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
5107627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5108f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in);
5109627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5110627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
5111627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5112105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
5113105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
511458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
511558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in);
5116105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
5117105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
51201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NKW > 10000) {
51211afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW);
51221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
51231afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
5124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
5127c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
5128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5130e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5131e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5132e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
51341afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NU > 10000) {
51351afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many uids " + NU);
51361afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
51371afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
51399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
51409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
51419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
514358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            u.mWifiRunning = false;
51446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
514558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.readSummaryFromParcelLocked(in);
51466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5147105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
51486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
51506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51516ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            u.mWifiScanStarted = false;
51526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51536ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                u.mWifiScanTimer.readSummaryFromParcelLocked(in);
51546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastEnabled = false;
51566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
51586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mAudioTurnedOn = false;
51606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in);
51626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mVideoTurnedOn = false;
51646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in);
51666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
5168617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
5169617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
5170617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
5171617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5172617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5173617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
5174617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5175617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
51765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
51779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
51787b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NW > 100) {
51791afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many wake locks " + NW);
51801afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
51811afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
51829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
51839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
51849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
51869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
51899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
51929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
51967b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
51971afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many sensors " + NP);
51981afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
51991afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
52009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
52019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
52029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
52039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
52049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
52059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
52097b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
52101afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many processes " + NP);
52111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
52121afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
52139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
52149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
521958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                int NSB = in.readInt();
52207b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NSB > 100) {
52217b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many speed bins " + NSB);
52227b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
52237b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
522458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                p.mSpeedBins = new SamplingCounter[NSB];
522558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<NSB; i++) {
522658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (in.readInt() != 0) {
522758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i] = new SamplingCounter(mUnpluggables);
522858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i].readSummaryFromParcelLocked(in);
522958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
523058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
52317b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (!p.readExcessivePowerFromParcelLocked(in)) {
52327b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
52337b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
52371afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
52381afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many packages " + NP);
52391afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
52401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
52467b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NS > 1000) {
52477b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many services " + NS);
52487b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
52497b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
52529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
52559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
52710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
52720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
52730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
52789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5281ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        writeHistory(out, true);
52825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
52846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED));
52856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
52866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED));
52876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
52886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5289633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
5290e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getLowDischargeAmountSinceCharge());
5291e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getHighDischargeAmountSinceCharge());
5292c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOnSinceCharge());
5293c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOffSinceCharge());
52949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5296617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5297617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5298617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
53009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53015284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5302627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5303627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5304f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5305627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5308105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
530958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5310105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5312c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
5313c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
5314c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
5315c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
5316c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
5317c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
5318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
5319c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
5320c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
5321c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5322c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
53235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5324e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
53259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
53269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
53279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
53289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
53299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
53305a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
533158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (u.mWifiRunningTimer != null) {
53326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
533358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mFullWifiLockTimer != null) {
53386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53436ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (u.mWifiScanTimer != null) {
53446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53456ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                u.mWifiScanTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mWifiMulticastTimer != null) {
53506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mAudioTurnedOnTimer != null) {
53566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mVideoTurnedOnTimer != null) {
53626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
5369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
5370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
5371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
5372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5373617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
5374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
53765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
53799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
53849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
53919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
53939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
54029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
54079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
54119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
54229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
54239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
543158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    final int N = ps.mSpeedBins.length;
543258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    out.writeInt(N);
543358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    for (int i=0; i<N; i++) {
543458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (ps.mSpeedBins[i] != null) {
543558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(1);
543658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            ps.mSpeedBins[i].writeSummaryFromParcelLocked(out);
543758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        } else {
543858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(0);
543958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
544058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
5441287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ps.writeExcessivePowerToParcelLocked(out);
54429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
54469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
54479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
54489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
54499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
54509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
54519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
54529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
54539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
54549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
54559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
54569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
54589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
54599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
54609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
54619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
54639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
54649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
54659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
54669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED));
54706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED));
54719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
54759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
54769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
54799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
54809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
54819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
54829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5484ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        readHistory(in, false);
54855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
54883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastUptime = 0;
54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
54903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastRealtime = 0;
54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
54920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in);
5493617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
54940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i,
54950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5496617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5497617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
54989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
54990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
55005284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
55010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i,
55020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5503627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
55040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in);
5505627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
55060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i,
55070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5508627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5509105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
55100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
551158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
551258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
5513105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
55140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
55159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
55169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
55173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastUptime = 0;
55189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
55199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
55203bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastRealtime = 0;
55219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
55229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
55239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
55249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
55259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
55269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
55279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
55289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
55296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5530633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
55313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
55323bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
5533c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = in.readInt();
5534c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
5535c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = in.readInt();
5536c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
55379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
55389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_LAST] = in.readLong();
55406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1;
55413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_LAST] = in.readLong();
55426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1;
55433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_LAST] = in.readLong();
55446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1;
55453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_LAST] = in.readLong();
55466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1;
55473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = in.readLong();
55493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
55503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = in.readInt();
55523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
55533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
5554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
5555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
5556c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
5559244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel
5560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
5561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
5562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5563c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
55645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
55669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
55679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
556858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiRunningTimers.clear();
556958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mFullWifiLockTimers.clear();
55706ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        mWifiScanTimers.clear();
557158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiMulticastTimers.clear();
55729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5573e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5574e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
55759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
55769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
55779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
55789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
55799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
55809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
55819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
55829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
55863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, true, flags);
55873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
55883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
55893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public void writeToParcelWithoutUids(Parcel out, int flags) {
55903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, false, flags);
55919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    @SuppressWarnings("unused")
55943bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void writeToParcelLocked(Parcel out, boolean inclUids, int flags) {
55950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
55960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
55970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
55989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
55999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
56009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
56019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
56025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
56039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
56045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5605ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        writeHistory(out, false);
56065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
56079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
56089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
56099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
56109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
5611617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5612617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
5613617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5614617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
56159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
56165284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
5618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5619f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime);
5620627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5621627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
5622627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5623105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
562458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime);
5625105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
56269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
56279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
56289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
56299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
56309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
56319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
56329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
56339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
56349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
56359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
56369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
56376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5638633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
56393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mLowDischargeAmountSinceCharge);
56403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mHighDischargeAmountSinceCharge);
5641c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOn);
5642c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOnSinceCharge);
5643c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOff);
5644c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOffSinceCharge);
56459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
56469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED));
56486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED));
56496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED));
56506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED));
56513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
56523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Write radio uptime for data
56533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeLong(getRadioDataUptime());
56543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
56553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeInt(getBluetoothPingCount());
56563718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
56573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
56583bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(mKernelWakelockStats.size());
56593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
56603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                SamplingTimer kwlt = ent.getValue();
56613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (kwlt != null) {
56623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(1);
56633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeString(ent.getKey());
56643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
56653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                } else {
56663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(0);
56673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                }
5668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
56693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
56703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
5671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5672e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5673e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
5674e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
56753bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
56763bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            int size = mUidStats.size();
56773bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(size);
56783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (int i = 0; i < size; i++) {
56793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                out.writeInt(mUidStats.keyAt(i));
56803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                Uid uid = mUidStats.valueAt(i);
56819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56823bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                uid.writeToParcelLocked(out, batteryRealtime);
56833bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
56843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
56853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
56869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
56909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
56919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
56929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
56939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
56969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
56979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
56995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
57000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void prepareForDumpLocked() {
57010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to retrieve current kernel wake lock stats before printing.
57020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
57030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
57040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
57051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
57069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
57071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
57081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
57091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
5710617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
57111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
57121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
5713617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
57141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
57151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
57161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
57171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
57185284090631e638b916d9a453212e9dc802656a67Wink Saville            for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
57191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
57201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
5721627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
5722f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            pr.println("*** Signal scanning :");
5723f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.logState(pr, "  ");
5724627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
57251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
57261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
57271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
57281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
57291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
57301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
573158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.logState(pr, "  ");
57321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
57331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
57341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            pr.println("*** Mobile ifaces:");
57351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            pr.println(mMobileIfaces.toString());
57369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
57379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
57389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats mNetworkSummaryCache;
57411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats mNetworkDetailCache;
57421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats getNetworkStatsSummary() {
57441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // NOTE: calls from BatteryStatsService already hold this lock
57451059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (this) {
57461059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (mNetworkSummaryCache == null
57471059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    || mNetworkSummaryCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) {
5748418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                mNetworkSummaryCache = null;
5749418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey
5750418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) {
5751418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    try {
5752e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                        mNetworkSummaryCache = mNetworkStatsFactory.readNetworkStatsSummaryDev();
5753418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    } catch (IllegalStateException e) {
5754418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                        Log.wtf(TAG, "problem reading network stats", e);
5755418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    }
5756418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                }
5757418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey
5758418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                if (mNetworkSummaryCache == null) {
57591059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkSummaryCache = new NetworkStats(SystemClock.elapsedRealtime(), 0);
57601059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
57611059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
57621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            return mNetworkSummaryCache;
57631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
57641059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
57651059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57661059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats getNetworkStatsDetailGroupedByUid() {
57671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // NOTE: calls from BatteryStatsService already hold this lock
57681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (this) {
57691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (mNetworkDetailCache == null
57701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    || mNetworkDetailCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) {
5771418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                mNetworkDetailCache = null;
5772418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey
5773418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) {
5774418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    try {
5775418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                        mNetworkDetailCache = mNetworkStatsFactory
5776418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                                .readNetworkStatsDetail().groupedByUid();
5777418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    } catch (IllegalStateException e) {
5778418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                        Log.wtf(TAG, "problem reading network stats", e);
5779418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    }
5780418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                }
5781418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey
5782418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                if (mNetworkDetailCache == null) {
57831059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkDetailCache = new NetworkStats(SystemClock.elapsedRealtime(), 0);
57841059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
57851059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
57861059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            return mNetworkDetailCache;
57871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
57881059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
57899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5790