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
90df693de4fe12f081555b449e2726e205fbd86572Jeff Brown    private static final int VERSION = 62 + (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
2335fb900813511df0706469ad340bfb0810b5a12cd7Catherine Liu    @Override public int getPhoneSignalStrengthCount(int strengthBin, int which) {
2336fb900813511df0706469ad340bfb0810b5a12cd7Catherine Liu        return mPhoneSignalStrengthsTimer[strengthBin].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            }
2684df693de4fe12f081555b449e2726e205fbd86572Jeff Brown            if (type >= 0 && type < NUM_USER_ACTIVITY_TYPES) {
2685df693de4fe12f081555b449e2726e205fbd86572Jeff Brown                mUserActivityCounters[type].stepAtomic();
2686df693de4fe12f081555b449e2726e205fbd86572Jeff Brown            } else {
2687df693de4fe12f081555b449e2726e205fbd86572Jeff Brown                Slog.w(TAG, "Unknown user activity type " + type + " was specified.",
2688df693de4fe12f081555b449e2726e205fbd86572Jeff Brown                        new Throwable());
2689df693de4fe12f081555b449e2726e205fbd86572Jeff Brown            }
2690617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2692617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2693617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
2694617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
2695617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2697617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2698617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
2699617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2700617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
2701617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
2703617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
27045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2705617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
2706617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2707617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2708617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
2709617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2710617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
27115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
27131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final long uidTxBytes = getNetworkStatsDetailGroupedByUid().getTotal(
27141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    null, mUid).txBytes;
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
27161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    ? (uidTxBytes - mStartedTcpBytesSent) : 0);
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2718244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
27196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
27206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear all stats for this uid.  Returns true if the uid is completely
27216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * inactive so can be dropped.
27226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
27236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        boolean reset() {
27246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean active = false;
27255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
272658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
272758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false);
272858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= mWifiRunning;
27296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
27319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false);
27326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mFullWifiLockOut;
27336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27346ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (mWifiScanTimer != null) {
27356ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                active |= !mWifiScanTimer.reset(BatteryStatsImpl.this, false);
27366ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                active |= mWifiScanStarted;
27376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
27399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false);
27406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mWifiMulticastEnabled;
27416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
27439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false);
27446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mAudioTurnedOn;
27456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
27479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false);
27486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mVideoTurnedOn;
27496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0;
27526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0;
27535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
27556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
27566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUserActivityCounters[i].reset(false);
27576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
27606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWakelockStats.size() > 0) {
27616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator();
27626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Wakelock> wakelockEntry = it.next();
27646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Wakelock wl = wakelockEntry.getValue();
27656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (wl.reset()) {
27666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
27676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
27686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
27696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mSensorStats.size() > 0) {
27736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator();
27746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<Integer, Sensor> sensorEntry = it.next();
27766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Sensor s = sensorEntry.getValue();
27776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (s.reset()) {
27786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
27796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
27806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
27816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mProcessStats.size() > 0) {
27856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator();
27866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Proc> procEntry = it.next();
27886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    procEntry.getValue().detach();
27896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mProcessStats.clear();
27916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mPids.size() > 0) {
27939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; !active && i<mPids.size(); i++) {
27949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    Pid pid = mPids.valueAt(i);
27959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    if (pid.mWakeStart != 0) {
27969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        active = true;
27979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    }
27989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
27999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
28006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mPackageStats.size() > 0) {
28016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator();
28026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
28036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Pkg> pkgEntry = it.next();
28046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Pkg p = pkgEntry.getValue();
28056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    p.detach();
28066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (p.mServiceStats.size() > 0) {
28076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        Iterator<Map.Entry<String, Pkg.Serv>> it2
28086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                                = p.mServiceStats.entrySet().iterator();
28096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        while (it2.hasNext()) {
28106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            Map.Entry<String, Pkg.Serv> servEntry = it2.next();
28116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            servEntry.getValue().detach();
28126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
28136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
28146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mPackageStats.clear();
28166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPids.clear();
28199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
28206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!active) {
282158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer != null) {
282258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer.detach();
28236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer != null) {
28256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mFullWifiLockTimer.detach();
28266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28276ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                if (mWifiScanTimer != null) {
28286ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                    mWifiScanTimer.detach();
28296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer != null) {
28316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mWifiMulticastTimer.detach();
28326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer != null) {
28346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mAudioTurnedOnTimer.detach();
28356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer != null) {
28376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mVideoTurnedOnTimer.detach();
28386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mUserActivityCounters != null) {
28406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
28416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUserActivityCounters[i].detach();
28426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
28436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return !active;
28476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
28485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
288458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
28856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
288658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.writeToParcel(out, batteryRealtime);
28876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
2888617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
28896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
28916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
2893617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
28946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28966ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (mWifiScanTimer != null) {
28976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28986ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanTimer.writeToParcel(out, batteryRealtime);
28996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
29016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
29036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
29046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer.writeToParcel(out, batteryRealtime);
29056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
29076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
29096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
29106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime);
29116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
29136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
29156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
29166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime);
29176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
29196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
2921617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
2922617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2923617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
2924617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
29256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
2927617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
2937c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                // We will just drop some random set of wakelocks if
2938c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                // the previous run of the system was an older version
2939c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                // that didn't impose a limit.
2940c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                mWakelockStats.put(wakelockName, wakelock);
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
297658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunning = false;
29776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
297858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
297958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiRunningTimers, mUnpluggables, in);
29806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
298158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = null;
29826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2983105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
29846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
298658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mFullWifiLockTimers, mUnpluggables, in);
29876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer = null;
29896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29906ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mWifiScanStarted = false;
29916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29926ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
29936ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                        mWifiScanTimers, mUnpluggables, in);
29946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29956ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                mWifiScanTimer = null;
29966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastEnabled = false;
29986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
300058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiMulticastTimers, mUnpluggables, in);
3001617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
30026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer = null;
30036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mAudioTurnedOn = false;
30056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
30060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
30076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
30086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
30096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer = null;
30106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mVideoTurnedOn = false;
30126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
30130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
30146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
30156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
30166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer = null;
30176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
3019617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
3020617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
3021617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
3022617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
30236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
30246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUserActivityCounters = null;
3025617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3054c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, type, pool, unpluggables, in);
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
30646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                boolean wlactive = false;
30656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerFull != null) {
30669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false);
30676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerPartial != null) {
30699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false);
30706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerWindow != null) {
30729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false);
30736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (!wlactive) {
30756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerFull != null) {
30766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull.detach();
30776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull = null;
30786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerPartial != null) {
30806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial.detach();
30816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial = null;
30826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerWindow != null) {
30846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow.detach();
30856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow = null;
30866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return !wlactive;
30896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
3119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
31205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
3133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in);
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
31409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (mTimer.reset(BatteryStatsImpl.this, true)) {
31416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mTimer = null;
31426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return true;
31436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
31446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return false;
31456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
31465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3159eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3160eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3186eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Amount of time the process was running in the foreground.
3187eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3188eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mForegroundTime;
3189eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3190eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3206eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from a previous save.
3207eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3208eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLoadedForegroundTime;
3209eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3210eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3226eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from the previous run
3227eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3228eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLastForegroundTime;
3229eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3230eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3245eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
3246eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time since unplugged.
3247eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3248eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mUnpluggedForegroundTime;
3249eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3250e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            SamplingCounter[] mSpeedBins;
3251e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3252287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            ArrayList<ExcessivePower> mExcessivePower;
32539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
3256e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[getCpuSpeedSteps()];
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3258e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
3263eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = mForegroundTime;
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32685a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
32696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
32706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
32716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i = 0; i < mSpeedBins.length; i++) {
32726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
32736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
32746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUnpluggables.remove(c);
32756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = null;
32766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
32776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
32786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
32795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3280287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public int countExcessivePowers() {
3281287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                return mExcessivePower != null ? mExcessivePower.size() : 0;
32829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3284287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public ExcessivePower getExcessivePower(int i) {
3285287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower != null) {
3286287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    return mExcessivePower.get(i);
32879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return null;
32899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            public void addExcessiveWake(long overTime, long usedTime) {
3292287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3293287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
32949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
3295287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3296287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_WAKE;
32979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.overTime = overTime;
32989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.usedTime = usedTime;
3299287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
33009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
33019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3302287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public void addExcessiveCpu(long overTime, long usedTime) {
3303287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3304287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
3305287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                }
3306287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3307287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_CPU;
3308287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.overTime = overTime;
3309287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.usedTime = usedTime;
3310287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
3311287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
3312287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
3313287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            void writeExcessivePowerToParcelLocked(Parcel out) {
3314287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
33159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeInt(0);
33169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    return;
33179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3319287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                final int N = mExcessivePower.size();
33209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                out.writeInt(N);
33219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3322287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = mExcessivePower.get(i);
3323287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    out.writeInt(ew.type);
33249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.overTime);
33259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.usedTime);
33269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
33289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
33297b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            boolean readExcessivePowerFromParcelLocked(Parcel in) {
33309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                final int N = in.readInt();
33319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (N == 0) {
3332287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = null;
33337b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return true;
33349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
33367b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (N > 10000) {
33377b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many excessive power entries " + N);
33387b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return false;
33397b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
33407b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn
3341287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower = new ArrayList<ExcessivePower>();
33429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3343287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = new ExcessivePower();
3344287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ew.type = in.readInt();
33459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.overTime = in.readLong();
33469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.usedTime = in.readLong();
3347287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower.add(ew);
33489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33497b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                return true;
33509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
33519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
3355eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mForegroundTime);
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
3359eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLoadedForegroundTime);
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
3363eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mUnpluggedForegroundTime);
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
3365e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3366e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                out.writeInt(mSpeedBins.length);
3367e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
33686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
33696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
33706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(1);
33716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.writeToParcel(out);
33726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
33736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(0);
33746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3375e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
33769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3377287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                writeExcessivePowerToParcelLocked(out);
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
3383eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime = in.readLong();
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
3387eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLoadedForegroundTime = in.readLong();
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
33893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastUserTime = 0;
33903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastSystemTime = 0;
33913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastForegroundTime = 0;
33923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastStarts = 0;
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
3395eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = in.readLong();
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
3397e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3398e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                int bins = in.readInt();
33996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                int steps = getCpuSpeedSteps();
34006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps];
3401e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < bins; i++) {
34026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (in.readInt() != 0) {
34036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = new SamplingCounter(mUnpluggables, in);
34046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3405e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
34069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3407287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                readExcessivePowerFromParcelLocked(in);
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public void addForegroundTimeLocked(long ttime) {
3420eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime += ttime;
3421eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3422eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
34366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
34526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
3460eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public long getForegroundTime(int which) {
3461eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                long val;
3462eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                if (which == STATS_LAST) {
3463eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mLastForegroundTime;
3464eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                } else {
3465eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mForegroundTime;
3466eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    if (which == STATS_CURRENT) {
3467eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mLoadedForegroundTime;
34686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
3469eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mUnpluggedForegroundTime;
3470eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    }
3471eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                }
3472eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                return val;
3473eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3474eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3475eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
34846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3490e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3491e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /* Called by ActivityManagerService when CPU times are updated. */
3492e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public void addSpeedStepTimes(long[] values) {
3493e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length && i < values.length; i++) {
34946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    long amt = values[i];
34956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (amt != 0) {
34966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        SamplingCounter c = mSpeedBins[i];
34976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        if (c == null) {
34986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            mSpeedBins[i] = c = new SamplingCounter(mUnpluggables);
34996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
35006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.addCountAtomic(values[i]);
35016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3502e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3503e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
3504e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3505e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            @Override
3506e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public long getTimeAtCpuSpeedStep(int speedStep, int which) {
3507e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                if (speedStep < mSpeedBins.length) {
35086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[speedStep];
35096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return c != null ? c.getCountLocked(which) : 0;
3510e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                } else {
3511e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return 0;
3512e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3513e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
35616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
35626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
35635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
35673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastWakeups = 0;
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
36096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
37246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                void detach() {
37256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUnpluggables.remove(this);
37266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
37275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
37403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStartTime = 0;
37413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStarts = 0;
37423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastLaunches = 0;
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
38296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
38466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
38636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
38659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
38739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
38749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        public SparseArray<? extends Pid> getPidStats() {
3900b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            return mPids;
3901b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        }
39025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
39039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public Pid getPidStatsLocked(int pid) {
39049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Pid p = mPids.get(pid);
39059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p == null) {
39069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p = new Pid();
39079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mPids.put(pid, p);
39089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
39099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return p;
39109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
39119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3941c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
3944c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                final int N = mWakelockStats.size();
3945c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                if (N > MAX_WAKELOCKS_PER_UID && (mUid != Process.SYSTEM_UID
3946c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        || N > MAX_WAKELOCKS_PER_UID_IN_SYSTEM)) {
39479e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    name = BATCHED_WAKELOCK_NAME;
39489e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = mWakelockStats.get(name);
39499e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
39509e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (wl == null) {
39519e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = new Wakelock();
39529e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(name, wl);
39539e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3955c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL,
39610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mPartialTimers, mUnpluggables);
39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
39669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL,
39690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mFullTimers, mUnpluggables);
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
39749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
39759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW,
39770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mWindowTimers, mUnpluggables);
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
39799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
39829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
39839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3986c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
39889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3995c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3999c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
4001c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
40039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables);
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStartWakeLocked(int pid, String name, int type) {
4010c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40141ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
40159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = getPidStatsLocked(pid);
4016b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p.mWakeStart == 0) {
4017b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                    p.mWakeStart = SystemClock.elapsedRealtime();
4018b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                }
40199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStopWakeLocked(int pid, String name, int type) {
4023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40271ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
40289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = mPids.get(pid);
4029b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p != null && p.mWakeStart != 0) {
40309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart;
40319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeStart = 0;
40329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
40339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
40349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
40359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
40369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) {
40379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Proc p = getProcessStatsLocked(proc);
40389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
40399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p.addExcessiveWake(overTime, usedTime);
40409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4043287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) {
4044287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            Proc p = getProcessStatsLocked(proc);
4045287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            if (p != null) {
4046287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                p.addExcessiveCpu(overTime, usedTime);
4047287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
4048287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
4049287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
4051c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
4059c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
40625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
4066c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
4073c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
4076244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
40851afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = new JournaledFile(new File(filename), new File(filename + ".tmp"));
40860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = new MyHandler();
40879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
40880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables);
4089617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
40900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables);
4091617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4092617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
40930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables);
40945284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
40950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables);
4096627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
40970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables);
4098627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
40990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables);
4100627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
41010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables);
410258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables);
41030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables);
41040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables);
41050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables);
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
41076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
41129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
4114633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
41156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = 0;
4116633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
4117c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
41180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
41199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
41221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
41230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
41240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void setCallback(BatteryCallback cb) {
41290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mCallback = cb;
41300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
41310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
4132e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public void setNumSpeedSteps(int steps) {
4133e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (sNumSpeedSteps == 0) sNumSpeedSteps = steps;
4134e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4135e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4136f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void setRadioScanningTimeout(long timeout) {
4137f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneSignalScanningTimer != null) {
4138f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.setTimeout(timeout);
4139f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
4140f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
4141f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
41420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingOldHistoryLocked() {
41440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
41450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
41460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
41471fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        mHistoryReadTmp.clear();
41480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
41490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
4150ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return (mHistoryIterator = mHistory) != null;
4151ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4152ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
41530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextOldHistoryLocked(HistoryItem out) {
41550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize();
41560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!end) {
41571fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mHistoryReadTmp.readDelta(mHistoryBuffer);
41581fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW;
41590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4160ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        HistoryItem cur = mHistoryIterator;
4161ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (cur == null) {
41620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (!mReadOverflow && !end) {
41630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "Old history ends before new history!");
41640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
4165ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return false;
4166ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4167ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        out.setTo(cur);
4168ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mHistoryIterator = cur.next;
41690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!mReadOverflow) {
41700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (end) {
41710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "New history ends before old history!");
41721fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else if (!out.same(mHistoryReadTmp)) {
41730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
41740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                PrintWriter pw = new PrintWriter(new LogWriter(android.util.Log.WARN, TAG));
41750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Histories differ!");
41760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Old history:");
41770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, out, now);
41780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("New history:");
41791fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, now);
41800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
41810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4182ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return true;
4183ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4184ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
41860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingOldHistoryLocked() {
41870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
41880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
41890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingHistoryLocked() {
41930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
41940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
41950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
41960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
41970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
41980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return mHistoryBuffer.dataSize() > 0;
41990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
42000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
42010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
42020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextHistoryLocked(HistoryItem out) {
42031fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        final int pos = mHistoryBuffer.dataPosition();
42041fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        if (pos == 0) {
42051fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            out.clear();
42061fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        }
42071fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        boolean end = pos >= mHistoryBuffer.dataSize();
42080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (end) {
42090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return false;
42100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
42110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
42121fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        out.readDelta(mHistoryBuffer);
42130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return true;
42140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
42150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
42160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
42170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingHistoryLocked() {
42180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
42190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
422032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
42215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
422232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    @Override
4223b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    public long getHistoryBaseTime() {
4224b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        return mHistoryBaseTime;
4225b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    }
42265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4227b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    @Override
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
42309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public boolean isScreenOn() {
42379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return mScreenOn;
42389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
42399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
42406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void initTimes() {
42416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryRealtime = mTrackBatteryPastUptime = 0;
42426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryUptime = mTrackBatteryPastRealtime = 0;
42436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
42446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
42456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
42466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
42476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
42485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4249c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    void initDischarge() {
4250c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mLowDischargeAmountSinceCharge = 0;
4251c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mHighDischargeAmountSinceCharge = 0;
4252c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = 0;
4253c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = 0;
4254c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = 0;
4255c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = 0;
4256c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4257c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
42586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void resetAllStatsLocked() {
42596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mStartCount = 0;
42606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
42619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mScreenOnTimer.reset(this, false);
42626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
42639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mScreenBrightnessTimer[i].reset(this, false);
42646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mInputEventCounter.reset(false);
42669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneOnTimer.reset(this, false);
42679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mAudioOnTimer.reset(this, false);
42689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mVideoOnTimer.reset(this, false);
42695284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
42709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneSignalStrengthsTimer[i].reset(this, false);
42716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneSignalScanningTimer.reset(this, false);
42736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
42749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneDataConnectionsTimer[i].reset(this, false);
42756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mWifiOnTimer.reset(this, false);
427758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.reset(this, false);
42789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mBluetoothOnTimer.reset(this, false);
42795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<mUidStats.size(); i++) {
42816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUidStats.valueAt(i).reset()) {
42826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUidStats.remove(mUidStats.keyAt(i));
42836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                i--;
42846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
42856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mKernelWakelockStats.size() > 0) {
42886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            for (SamplingTimer timer : mKernelWakelockStats.values()) {
42896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(timer);
42906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
42916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mKernelWakelockStats.clear();
42926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4294c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
42955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        clearHistoryLocked();
42976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
42985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
429932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) {
4300c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (oldScreenOn) {
4301c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel;
4302c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4303c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOn += diff;
4304c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOnSinceCharge += diff;
4305c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4306c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4307c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel;
4308c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4309c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOff += diff;
4310c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOffSinceCharge += diff;
4311c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4312c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4313c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (newScreenOn) {
4314c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel;
4315c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = 0;
4316c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4317c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = 0;
4318c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel;
4319c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4320c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4321c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
43226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void setOnBattery(boolean onBattery, int oldStatus, int level) {
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
432432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            setOnBatteryLocked(onBattery, oldStatus, level);
432532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
432632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    }
432732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
432832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void setOnBatteryLocked(boolean onBattery, int oldStatus, int level) {
432932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        boolean doWrite = false;
433032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE);
433132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        m.arg1 = onBattery ? 1 : 0;
433232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mHandler.sendMessage(m);
433332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mOnBattery = mOnBatteryInternal = onBattery;
433432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
433532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long uptime = SystemClock.uptimeMillis() * 1000;
433632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long mSecRealtime = SystemClock.elapsedRealtime();
433732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long realtime = mSecRealtime * 1000;
433832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (onBattery) {
433932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // We will reset our status if we are unplugging after the
434032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // battery was last full, or the level is at 100, or
434132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // we have gone through a significant charge (from a very low
434232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // level to a now very high level).
434332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (oldStatus == BatteryManager.BATTERY_STATUS_FULL
434432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || level >= 90
434532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || (mDischargeCurrentLevel < 20 && level >= 80)) {
434632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                doWrite = true;
434732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                resetAllStatsLocked();
434832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeStartLevel = level;
434932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
435032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
435132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
435232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
435332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: "
435432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
435532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
435632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryUptimeStart = uptime;
435732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryRealtimeStart = realtime;
435832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
435932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
436032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = mDischargeUnplugLevel = level;
436132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mScreenOn) {
436232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = level;
436332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = 0;
43646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
436532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = 0;
436632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = level;
43676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
436832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOn = 0;
436932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOff = 0;
437032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
437132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        } else {
437232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
437332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
437432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
437532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: "
437632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
437732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
437832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
437932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
438032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = level;
438132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (level < mDischargeUnplugLevel) {
438232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;
438332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level;
438432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
438532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn);
438632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
438732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
438832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) {
438932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mFile != null) {
439032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                writeAsyncLocked();
43919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
43956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // This should probably be exposed in the API, though it's not critical
43966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    private static final int BATTERY_PLUGGED_NONE = 0;
43975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
43986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void setBatteryState(int status, int health, int plugType, int level,
43996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int temp, int volt) {
440032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        synchronized(this) {
440132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
440232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            int oldStatus = mHistoryCur.batteryStatus;
440332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!mHaveBatteryLevel) {
440432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHaveBatteryLevel = true;
440532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We start out assuming that the device is plugged in (not
440632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // on battery).  If our first report is now that we are indeed
440732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // plugged in, then twiddle our state to correctly reflect that
440832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // since we won't be going through the full setOnBattery().
440932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (onBattery == mOnBattery) {
441032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    if (onBattery) {
441132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
441232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    } else {
441332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
441432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    }
44156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
441632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                oldStatus = status;
44176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
441832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery) {
441932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeCurrentLevel = level;
442032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = true;
44216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
442232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery != mOnBattery) {
442332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHistoryCur.batteryLevel = (byte)level;
44246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryStatus = (byte)status;
44256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryHealth = (byte)health;
44266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryPlugType = (byte)plugType;
44276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryTemperature = (char)temp;
44286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryVoltage = (char)volt;
442932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                setOnBatteryLocked(onBattery, oldStatus, level);
443032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            } else {
443132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                boolean changed = false;
443232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryLevel != level) {
443332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryLevel = (byte)level;
443432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
443532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
443632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryStatus != status) {
443732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryStatus = (byte)status;
443832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
443932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
444032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryHealth != health) {
444132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryHealth = (byte)health;
444232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
444332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
444432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryPlugType != plugType) {
444532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryPlugType = (byte)plugType;
444632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
444732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
444832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (temp >= (mHistoryCur.batteryTemperature+10)
444932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || temp <= (mHistoryCur.batteryTemperature-10)) {
445032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryTemperature = (char)temp;
445132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
445232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
445332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (volt > (mHistoryCur.batteryVoltage+20)
445432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || volt < (mHistoryCur.batteryVoltage-20)) {
445532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryVoltage = (char)volt;
445632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
445732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
445832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (changed) {
445932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    addHistoryRecordLocked(SystemClock.elapsedRealtime());
446032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
44616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
446232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
446332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We don't record history while we are plugged in and fully charged.
446432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // The next time we are unplugged, history will be cleared.
446532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = false;
44666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
44676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4468633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
44695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4470c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
4471c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
44725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4473d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        if (m == null) {
4474d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            // Not crashing might make board bringup easier.
44751afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "Couldn't get kernel wake lock stats");
4476d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            return;
4477d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        }
4478d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen
4479c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
4480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
4481c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
44825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4483c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
4484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
44855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
4486c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
4487c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
4488c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4489c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
4490c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
4491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
4492c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
44935a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
4495c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
4496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
4497c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
4498c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
4499c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
4500c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
4501c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4502c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4503c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
45049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart);
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
45196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
45209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart);
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
45306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
45446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
45596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
45619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
45689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
45699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
45719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
45859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long getTcpBytes(long current, long[] dataBytes, int which) {
45963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (which == STATS_LAST) {
45973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return dataBytes[STATS_LAST];
45983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
45996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (which == STATS_SINCE_UNPLUGGED) {
46006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) {
46013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return dataBytes[STATS_LAST];
46023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                } else {
46036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return current - dataBytes[STATS_SINCE_UNPLUGGED];
46043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                }
46056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else if (which == STATS_SINCE_CHARGED) {
46066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED];
46073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            }
46083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return current - dataBytes[STATS_CURRENT];
46093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
46103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
46123718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
46133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesSent(int which) {
46141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long mobileTxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).txBytes;
46151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(mobileTxBytes, mMobileDataTx, which);
46163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46173718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
46183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
46193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesReceived(int which) {
46201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long mobileRxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).rxBytes;
46211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(mobileRxBytes, mMobileDataRx, which);
46223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
46243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
46253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesSent(int which) {
46261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long totalTxBytes = getNetworkStatsSummary().getTotal(null).txBytes;
46271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(totalTxBytes, mTotalDataTx, which);
46283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
46303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
46313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesReceived(int which) {
46321059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long totalRxBytes = getNetworkStatsSummary().getTotal(null).rxBytes;
46331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(totalRxBytes, mTotalDataRx, which);
46343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
4636105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4637633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
4638105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4639633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
4640105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4641105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4643633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
46446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mDischargeUnplugLevel;
4645105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4647105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4648633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
4649105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4650633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
4651105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4652105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4654633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
4655e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return mDischargeCurrentLevel;
4656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4658e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    @Override
46593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getLowDischargeAmountSinceCharge() {
46603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4661e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mLowDischargeAmountSinceCharge;
4662e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4663e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel-1;
4664e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4665e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
46663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
46673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
46683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
46693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
46703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getHighDischargeAmountSinceCharge() {
46713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4672e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mHighDischargeAmountSinceCharge;
4673e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4674e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel;
4675e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4676e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
46773bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
46783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
4679c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4680c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOn() {
4681c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4682c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOn;
4683c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4684c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4685c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4686c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4687c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4688c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4689c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4690c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4691c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOnSinceCharge() {
4692c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4693c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOnSinceCharge;
4694c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4695c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4696c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4697c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4698c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4699c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4700c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4701c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4702c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOff() {
4703c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4704c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOff;
4705c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4706c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4707c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4708c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4709c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4710c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4711c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4712c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4713c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOffSinceCharge() {
4714c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4715c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOffSinceCharge;
4716c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4717c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4718c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4719c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4720c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4721c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4722c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
47233bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
47243bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
4725e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public int getCpuSpeedSteps() {
4726e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return sNumSpeedSteps;
4727e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4728e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
47319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
47339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
47359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
47369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
47469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
474732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
47489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
47559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
475832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * Retrieve the statistics object for a particular process, given
475932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * the name of the process.
476032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @param name process name
476132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @return the statistics object for the process
476232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     */
4763819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public Uid.Proc getProcessStatsLocked(String name, int pid) {
476432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        int uid;
476532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (mUidCache.containsKey(name)) {
476632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            uid = mUidCache.get(name);
476732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        } else {
4768819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani            uid = Process.getUidForPid(pid);
476932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            mUidCache.put(name, uid);
477032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
477132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        Uid u = getUidStatsLocked(uid);
477232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        return u.getProcessStatsLocked(name);
477332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
477432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
477532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    /**
47769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
47779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
47809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
47829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
47869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
47899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
47919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    /**
479458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * Massage data to distribute any reasonable work down to more specific
479558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * owners.  Must only be called on a dead BatteryStats object!
479658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     */
479758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void distributeWorkLocked(int which) {
479858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        // Aggregate all CPU time associated with WIFI.
479958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        Uid wifiUid = mUidStats.get(Process.WIFI_UID);
480058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (wifiUid != null) {
480158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which);
480258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (Uid.Proc proc : wifiUid.mProcessStats.values()) {
480358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which);
480458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<mUidStats.size(); i++) {
480558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    Uid uid = mUidStats.valueAt(i);
480658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (uid.mUid != Process.WIFI_UID) {
480758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        long uidRunningTime = uid.getWifiRunningTime(uSecTime, which);
480858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (uidRunningTime > 0) {
480958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*");
481058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            long time = proc.getUserTime(which);
481158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
481258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mUserTime += time;
481358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mUserTime -= time;
481458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getSystemTime(which);
481558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
481658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mSystemTime += time;
481758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mSystemTime -= time;
481858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getForegroundTime(which);
481958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
482058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mForegroundTime += time;
482158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mForegroundTime -= time;
482258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            for (int sb=0; sb<proc.mSpeedBins.length; sb++) {
482358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                SamplingCounter sc = proc.mSpeedBins[sb];
482458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                if (sc != null) {
482558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = sc.getCountLocked(which);
482658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = (time*uidRunningTime)/totalRunningTime;
482758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    SamplingCounter uidSc = uidProc.mSpeedBins[sb];
482858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    if (uidSc == null) {
482958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidSc = new SamplingCounter(mUnpluggables);
483058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidProc.mSpeedBins[sb] = uidSc;
483158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    }
483258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    uidSc.mCount.addAndGet((int)time);
483358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    sc.mCount.addAndGet((int)-time);
483458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                }
483558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            }
483658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            totalRunningTime -= uidRunningTime;
483758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
483858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
483958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
484058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
484158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
484258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
484358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
48446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void shutdownLocked() {
4845ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSyncLocked();
48466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mShuttingDown = true;
48471afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    }
48485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4849ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    Parcel mPendingWrite = null;
4850ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    final ReentrantLock mWriteLock = new ReentrantLock();
4851ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4852ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeAsyncLocked() {
4853ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(false);
4854ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4855ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4856ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeSyncLocked() {
4857ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(true);
4858ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4859ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4860ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    void writeLocked(boolean sync) {
48611afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
48621afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "writeLocked: no file associated with this instance");
48639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
48649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mShuttingDown) {
48676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
48686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
48695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4870ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        Parcel out = Parcel.obtain();
4871ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSummaryToParcel(out);
4872ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mLastWriteTime = SystemClock.elapsedRealtime();
4873ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4874ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mPendingWrite != null) {
4875ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite.recycle();
4876ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4877ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mPendingWrite = out;
4878ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4879ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (sync) {
4880ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            commitPendingDataToDisk();
4881ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } else {
4882ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            Thread thr = new Thread("BatteryStats-Write") {
4883ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                @Override
4884ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                public void run() {
4885ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4886ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    commitPendingDataToDisk();
4887ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                }
4888ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            };
4889ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            thr.start();
4890ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4891ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4892ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4893ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void commitPendingDataToDisk() {
4894f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        final Parcel next;
4895ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        synchronized (this) {
4896ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next = mPendingWrite;
4897ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite = null;
4898f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            if (next == null) {
4899f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                return;
4900f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            }
4901ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4902ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.lock();
4903ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4904ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
49059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
49061afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite());
4907ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            stream.write(next.marshall());
49089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
49098bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn            FileUtils.sync(stream);
49109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
49111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            mFile.commit();
49129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
49131afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "Error writing battery statistics", e);
4914ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mFile.rollback();
4915ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } finally {
4916ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next.recycle();
4917ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.unlock();
49189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
49259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
49289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
49299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
49309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
49319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
49329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
49339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
49359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
49369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
49379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
49389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
49399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
49451afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
49461afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readLocked: no file associated with this instance");
49479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
49489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
49519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
49531afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            File file = mFile.chooseForRead();
49541afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (!file.exists()) {
49551afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
49569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49571afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileInputStream stream = new FileInputStream(file);
49589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
49609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
49619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
49649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
49669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
49671afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.e("BatteryStats", "Error reading battery statistics", e);
49689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long now = SystemClock.elapsedRealtime();
4971e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (USE_OLD_HISTORY) {
4972e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            addHistoryRecordLocked(now, HistoryItem.CMD_START);
4973e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
49740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(now, HistoryItem.CMD_START);
49759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
49789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
49799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4981ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    void readHistory(Parcel in, boolean andOldHistory) {
4982ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        final long historyBaseTime = in.readLong();
49830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
49840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataSize(0);
49850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
49860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
49870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int bufSize = in.readInt();
49880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int curPos = in.dataPosition();
49890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) {
49900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer too large " + bufSize);
49910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else if ((bufSize&~3) != bufSize) {
49920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer not aligned " + bufSize);
49930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else {
49940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (DEBUG_HISTORY) Slog.i(TAG, "***************** READING NEW HISTORY: " + bufSize
49950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    + " bytes at " + curPos);
49960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.appendFrom(in, curPos, bufSize);
49970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            in.setDataPosition(curPos + bufSize);
499832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
49995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5000ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (andOldHistory) {
5001ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            readOldHistory(in);
5002ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5003ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
5004ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
5005ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
5006ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** OLD mHistoryBaseTime: ");
5007ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
5008ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
5009ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5010ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        mHistoryBaseTime = historyBaseTime;
5011ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
5012ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
5013ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** NEW mHistoryBaseTime: ");
5014ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
5015ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
5016ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5017ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
5018ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        // We are just arbitrarily going to insert 1 minute from the sample of
5019ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        // the last run until samples in this run.
5020ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (mHistoryBaseTime > 0) {
5021ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            long oldnow = SystemClock.elapsedRealtime();
5022ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            mHistoryBaseTime = (mHistoryBaseTime - oldnow) + 60*1000;
5023ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            if (DEBUG_HISTORY) {
5024ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                StringBuilder sb = new StringBuilder(128);
5025ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                sb.append("****************** ADJUSTED mHistoryBaseTime: ");
5026ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                TimeUtils.formatDuration(mHistoryBaseTime, sb);
5027ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                Slog.i(TAG, sb.toString());
5028ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            }
50291e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn        }
503032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
50315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50320ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void readOldHistory(Parcel in) {
5033e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
5034e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
5035e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
50360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistory = mHistoryEnd = mHistoryCache = null;
50370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long time;
50385e3357fcee2a23a08434873a89e8ada4c6e6d893Conley Owens        while (in.dataAvail() > 0 && (time=in.readLong()) >= 0) {
50390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            HistoryItem rec = new HistoryItem(time, in);
50400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            addHistoryRecordLocked(rec);
50410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
50420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
50430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
5044ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    void writeHistory(Parcel out, boolean andOldHistory) {
5045ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
5046ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
5047ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** WRITING mHistoryBaseTime: ");
5048ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
5049ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append(" mLastHistoryTime: ");
5050ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mLastHistoryTime, sb);
5051ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
5052ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5053ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        out.writeLong(mHistoryBaseTime + mLastHistoryTime);
50540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.writeInt(mHistoryBuffer.dataSize());
50550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: "
50560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition());
50570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize());
5058ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
5059ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (andOldHistory) {
5060ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            writeOldHistory(out);
5061ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
50620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
50630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
50640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void writeOldHistory(Parcel out) {
5065e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
5066e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
5067e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
50686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistory;
506932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        while (rec != null) {
507032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (rec.time >= 0) rec.writeToParcel(out, 0);
507132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            rec = rec.next;
507232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
507332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        out.writeLong(-1);
507432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
50755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
50791afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readFromParcel: version got " + version
50809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
50819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
50829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5084ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        readHistory(in, true);
50855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
50879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
50889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
50899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
50909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
50916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5092633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
50933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
50943bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
5095c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
5096c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
50975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
50995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
5102617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
5104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5105617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
51079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
51085284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5109627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
5110627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5111f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in);
5112627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5113627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
5114627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
5116105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
511758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
511858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in);
5119105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
5120105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5122c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
51231afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NKW > 10000) {
51241afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW);
51251afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
51261afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
5127c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
5130c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
5131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5133e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5134e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5135e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
51371afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NU > 10000) {
51381afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many uids " + NU);
51391afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
51401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
51419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
51449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
514658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            u.mWifiRunning = false;
51476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
514858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.readSummaryFromParcelLocked(in);
51496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5150105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
51516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
51536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51546ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            u.mWifiScanStarted = false;
51556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51566ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                u.mWifiScanTimer.readSummaryFromParcelLocked(in);
51576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastEnabled = false;
51596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
51616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mAudioTurnedOn = false;
51636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in);
51656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mVideoTurnedOn = false;
51676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in);
51696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
5171617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
5172617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
5173617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
5174617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5175617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5176617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
5177617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5178617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
51795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
51809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
51817b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NW > 100) {
51821afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many wake locks " + NW);
51831afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
51841afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
51869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).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_PARTIAL).readSummaryFromParcelLocked(in);
51929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
51959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
51997b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
52001afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many sensors " + NP);
52011afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
52021afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
52039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
52049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
52059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
52069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
52079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
52089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
52127b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
52131afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many processes " + NP);
52141afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
52151afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
52209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
52219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
522258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                int NSB = in.readInt();
52237b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NSB > 100) {
52247b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many speed bins " + NSB);
52257b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
52267b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
522758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                p.mSpeedBins = new SamplingCounter[NSB];
522858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<NSB; i++) {
522958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (in.readInt() != 0) {
523058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i] = new SamplingCounter(mUnpluggables);
523158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i].readSummaryFromParcelLocked(in);
523258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
523358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
52347b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (!p.readExcessivePowerFromParcelLocked(in)) {
52357b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
52367b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
52401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
52411afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many packages " + NP);
52421afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
52431afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
52497b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NS > 1000) {
52507b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many services " + NS);
52517b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
52527b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
52559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
52599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
52740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
52750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
52760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
52789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5284ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        writeHistory(out, true);
52855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
52876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED));
52886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
52896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED));
52906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
52916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5292633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
5293e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getLowDischargeAmountSinceCharge());
5294e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getHighDischargeAmountSinceCharge());
5295c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOnSinceCharge());
5296c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOffSinceCharge());
52979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5302617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
53039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53045284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5305627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5307f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5308627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5309627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5310627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5311105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
531258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5315c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
5316c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
5317c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
5318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
5319c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
5320c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
5321c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
5322c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
5323c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
5324c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5325c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
53265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5327e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
53289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
53299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
53309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
53335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
533458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (u.mWifiRunningTimer != null) {
53356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
533658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mFullWifiLockTimer != null) {
53416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53466ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            if (u.mWifiScanTimer != null) {
53476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53486ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly                u.mWifiScanTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mWifiMulticastTimer != null) {
53536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mAudioTurnedOnTimer != null) {
53596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mVideoTurnedOnTimer != null) {
53656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
5372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
5373617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
5374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
5375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5376617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
5377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
53795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
53849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
53889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
53909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
53949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
53969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
54029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
54039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
54049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
54059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
54119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
54209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
54219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
54329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
54339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
543458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    final int N = ps.mSpeedBins.length;
543558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    out.writeInt(N);
543658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    for (int i=0; i<N; i++) {
543758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (ps.mSpeedBins[i] != null) {
543858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(1);
543958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            ps.mSpeedBins[i].writeSummaryFromParcelLocked(out);
544058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        } else {
544158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(0);
544258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
544358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
5444287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ps.writeExcessivePowerToParcelLocked(out);
54459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
54499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
54509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
54519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
54529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
54539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
54549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
54559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
54569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
54589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
54599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
54609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
54619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
54639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
54649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
54659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
54669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
54679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
54689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
54699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED));
54736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED));
54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
54789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
54799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54805a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
54829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
54839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
54849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5487ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        readHistory(in, false);
54885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
54913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastUptime = 0;
54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
54933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastRealtime = 0;
54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
54950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in);
5496617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
54970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i,
54980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5499617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5500617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
55019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
55020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
55035284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
55040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i,
55050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5506627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
55070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in);
5508627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
55090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i,
55100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5511627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5512105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
55130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
551458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
551558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
5516105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
55170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
55189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
55199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
55203bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastUptime = 0;
55219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
55229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
55233bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastRealtime = 0;
55249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
55259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
55269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
55279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
55289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
55299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
55309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
55319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
55326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5533633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
55343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
55353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
5536c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = in.readInt();
5537c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
5538c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = in.readInt();
5539c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
55409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
55419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_LAST] = in.readLong();
55436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1;
55443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_LAST] = in.readLong();
55456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1;
55463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_LAST] = in.readLong();
55476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1;
55483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_LAST] = in.readLong();
55496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1;
55503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = in.readLong();
55523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
55533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = in.readInt();
55553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
55563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
5557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
5558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
5559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
5562244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel
5563c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
5564c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
5565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
55675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
55699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
55709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
557158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiRunningTimers.clear();
557258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mFullWifiLockTimers.clear();
55736ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly        mWifiScanTimers.clear();
557458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiMulticastTimers.clear();
55759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5576e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5577e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
55789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
55799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
55809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
55819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
55829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
55839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
55849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
55859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
55893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, true, flags);
55903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
55913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
55923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public void writeToParcelWithoutUids(Parcel out, int flags) {
55933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, false, flags);
55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55955a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    @SuppressWarnings("unused")
55973bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void writeToParcelLocked(Parcel out, boolean inclUids, int flags) {
55980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
55990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
56000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
56019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
56029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
56039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
56049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
56055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
56069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
56075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5608ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        writeHistory(out, false);
56095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
56109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
56119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
56129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
56139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
5614617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5615617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
5616617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5617617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
56189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
56195284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5620627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
5621627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5622f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime);
5623627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5624627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
5625627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5626105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
562758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime);
5628105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
56299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
56309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
56319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
56329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
56339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
56349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
56359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
56369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
56379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
56389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
56399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
56406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5641633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
56423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mLowDischargeAmountSinceCharge);
56433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mHighDischargeAmountSinceCharge);
5644c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOn);
5645c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOnSinceCharge);
5646c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOff);
5647c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOffSinceCharge);
56489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
56499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED));
56516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED));
56526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED));
56536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED));
56543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
56553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Write radio uptime for data
56563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeLong(getRadioDataUptime());
56573f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
56583f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeInt(getBluetoothPingCount());
56593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
56603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
56613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(mKernelWakelockStats.size());
56623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
56633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                SamplingTimer kwlt = ent.getValue();
56643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (kwlt != null) {
56653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(1);
56663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeString(ent.getKey());
56673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
56683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                } else {
56693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(0);
56703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                }
5671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
56723bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
56733bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
5674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5675e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5676e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
5677e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
56783bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
56793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            int size = mUidStats.size();
56803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(size);
56813bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (int i = 0; i < size; i++) {
56823bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                out.writeInt(mUidStats.keyAt(i));
56833bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                Uid uid = mUidStats.valueAt(i);
56849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                uid.writeToParcelLocked(out, batteryRealtime);
56863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
56873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
56883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
56899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
56939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
56949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
56959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
56969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
56999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
57009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
57019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
57025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
57030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void prepareForDumpLocked() {
57040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to retrieve current kernel wake lock stats before printing.
57050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
57060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
57070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
57081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
57099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
57101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
57111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
57121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
5713617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
57141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
57151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
5716617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
57171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
57181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
57191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
57201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
57215284090631e638b916d9a453212e9dc802656a67Wink Saville            for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
57221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
57231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
5724627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
5725f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            pr.println("*** Signal scanning :");
5726f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.logState(pr, "  ");
5727627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
57281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
57291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
57301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
57311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
57321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
57331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
573458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.logState(pr, "  ");
57351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
57361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
57371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            pr.println("*** Mobile ifaces:");
57381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            pr.println(mMobileIfaces.toString());
57399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
57409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
57419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats mNetworkSummaryCache;
57441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats mNetworkDetailCache;
57451059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57461059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats getNetworkStatsSummary() {
57471059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // NOTE: calls from BatteryStatsService already hold this lock
57481059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (this) {
57491059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (mNetworkSummaryCache == null
57501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    || mNetworkSummaryCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) {
5751418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                mNetworkSummaryCache = null;
5752418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey
5753418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) {
5754418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    try {
5755e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey                        mNetworkSummaryCache = mNetworkStatsFactory.readNetworkStatsSummaryDev();
5756418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    } catch (IllegalStateException e) {
5757418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                        Log.wtf(TAG, "problem reading network stats", e);
5758418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    }
5759418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                }
5760418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey
5761418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                if (mNetworkSummaryCache == null) {
57621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkSummaryCache = new NetworkStats(SystemClock.elapsedRealtime(), 0);
57631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
57641059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
57651059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            return mNetworkSummaryCache;
57661059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
57671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
57681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats getNetworkStatsDetailGroupedByUid() {
57701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // NOTE: calls from BatteryStatsService already hold this lock
57711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (this) {
57721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (mNetworkDetailCache == null
57731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    || mNetworkDetailCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) {
5774418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                mNetworkDetailCache = null;
5775418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey
5776418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) {
5777418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    try {
5778418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                        mNetworkDetailCache = mNetworkStatsFactory
5779418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                                .readNetworkStatsDetail().groupedByUid();
5780418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    } catch (IllegalStateException e) {
5781418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                        Log.wtf(TAG, "problem reading network stats", e);
5782418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                    }
5783418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                }
5784418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey
5785418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey                if (mNetworkDetailCache == null) {
57861059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkDetailCache = new NetworkStats(SystemClock.elapsedRealtime(), 0);
57871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
57881059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
57891059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            return mNetworkDetailCache;
57901059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
57911059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
57929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5793