BatteryStatsImpl.java revision c24ab866b0d46685f6ddd340b9c84375cf8d6831
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.IFACE_ALL;
201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.UID_ALL;
211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.text.format.DateUtils.SECOND_IN_MILLIS;
221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn
233f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothDevice;
243f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset;
251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.content.res.Resources;
261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.ConnectivityManager;
271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.NetworkStats;
286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackbornimport android.os.BatteryManager;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
308bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils;
310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Handler;
320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Message;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
36c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
39f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState;
40e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
41627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackbornimport android.util.LogWriter;
441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
461afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport android.util.Slog;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
48ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackbornimport android.util.TimeUtils;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.R;
511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.net.NetworkStatsFactory;
521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.android.internal.util.JournaledFile;
531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport com.google.android.collect.Sets;
541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
641059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.util.HashSet;
65c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator;
665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganeshimport java.util.List;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
684cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger;
69ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackbornimport java.util.concurrent.locks.ReentrantLock;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
7932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    private static final boolean DEBUG_HISTORY = false;
80e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn    private static final boolean USE_OLD_HISTORY = false;   // for debugging.
815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
821059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    // TODO: remove "tcp" from network methods, since we measure total stats.
831059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
88e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn    private static final int VERSION = 61 + (USE_OLD_HISTORY ? 1000 : 0);
89e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // Maximum number of items we will record in the history.
917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_HISTORY_ITEMS = 2000;
925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
93f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    // No, really, THIS is the maximum number of items we will record in the history.
94f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    private static final int MAX_MAX_HISTORY_ITEMS = 3000;
95f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
969e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // The maximum number of names wakelocks we will keep track of
979e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // per uid; once the limit is reached, we batch the remaining wakelocks
989e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // in to one common name.
997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_WAKELOCKS_PER_UID = 30;
1005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
101c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn    // The system process gets more.  It is special.  Oh so special.
102c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn    // With, you know, special needs.  Like this.
103c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn    private static final int MAX_WAKELOCKS_PER_UID_IN_SYSTEM = 50;
104c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn
1059e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    private static final String BATCHED_WAKELOCK_NAME = "*overflow*";
1065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
107e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private static int sNumSpeedSteps;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1091afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    private final JournaledFile mFile;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_UPDATE_WAKELOCKS = 1;
1120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_REPORT_POWER_CHANGE = 2;
113287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    static final long DELAY_UPDATE_WAKELOCKS = 5*1000;
1140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public interface BatteryCallback {
1160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryNeedsCpuUpdate();
1170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryPowerChanged(boolean onBattery);
1180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
1190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final class MyHandler extends Handler {
1210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        @Override
1220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void handleMessage(Message msg) {
1230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            BatteryCallback cb = mCallback;
1240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            switch (msg.what) {
1250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_UPDATE_WAKELOCKS:
1260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryNeedsCpuUpdate();
1280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_REPORT_POWER_CHANGE:
1310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryPowerChanged(msg.arg1 != 0);
1330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
1360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
1370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
1380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private final MyHandler mHandler;
1400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private BatteryCallback mCallback;
1420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
153c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>();
154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>();
155c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>();
156c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers
157c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            = new SparseArray<ArrayList<StopwatchTimer>>();
15858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>();
15958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>();
16058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mScanWifiLockTimers = new ArrayList<StopwatchTimer>();
16158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>();
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    // Last partial timers we use for distributing CPU usage.
1640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>();
1650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
1695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mShuttingDown;
1715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    long mHistoryBaseTime;
1736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mHaveBatteryLevel = false;
1746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mRecordingHistory = true;
1756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mNumHistoryItems;
1760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1771fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    static final int MAX_HISTORY_BUFFER = 128*1024; // 128KB
1781fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    static final int MAX_MAX_HISTORY_BUFFER = 144*1024; // 144KB
1790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final Parcel mHistoryBuffer = Parcel.obtain();
1800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryLastWritten = new HistoryItem();
1810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryLastLastWritten = new HistoryItem();
1821fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn    final HistoryItem mHistoryReadTmp = new HistoryItem();
1830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    int mHistoryBufferLastPos = -1;
1840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    boolean mHistoryOverflow = false;
1850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    long mLastHistoryTime = 0;
1860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    final HistoryItem mHistoryCur = new HistoryItem();
1880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistory;
1906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryEnd;
1919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    HistoryItem mHistoryLastEnd;
1926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryCache;
1930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private HistoryItem mHistoryIterator;
1950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private boolean mReadOverflow;
1960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    private boolean mIteratingHistory;
1975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
2115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
213c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mScreenOnTimer;
2143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
215617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mScreenBrightnessBin = -1;
216c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
2175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    Counter mInputEventCounter;
2195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
221c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mPhoneOnTimer;
2225a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
223244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mAudioOn;
224244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mAudioOnTimer;
2255a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
226244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mVideoOn;
227244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mVideoOnTimer;
2285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
229627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
230e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    int mPhoneSignalStrengthBinRaw = -1;
231c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneSignalStrengthsTimer =
2325284090631e638b916d9a453212e9dc802656a67Wink Saville            new StopwatchTimer[SignalStrength.NUM_SIGNAL_STRENGTH_BINS];
233f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
234f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    StopwatchTimer mPhoneSignalScanningTimer;
235f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
236627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
2375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    final StopwatchTimer[] mPhoneDataConnectionsTimer =
238c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
2395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
240105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
241c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiOnTimer;
242617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mWifiOnUid = -1;
243d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
24458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    boolean mGlobalWifiRunning;
24558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    StopwatchTimer mGlobalWifiRunningTimer;
2465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
247105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
248c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mBluetoothOnTimer;
2493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /** Bluetooth headset object */
2513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    BluetoothHeadset mBtHeadset;
2523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
2633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
2663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
267105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
268105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
269105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
270633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeStartLevel;
2716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mDischargeUnplugLevel;
272633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeCurrentLevel;
2733bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mLowDischargeAmountSinceCharge;
2743bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mHighDischargeAmountSinceCharge;
275c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeScreenOnUnplugLevel;
276c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeScreenOffUnplugLevel;
277c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOn;
278c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOnSinceCharge;
279c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOff;
280c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    int mDischargeAmountScreenOffSinceCharge;
281244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
283244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    // Mobile data transferred while on battery
2853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataTx = new long[4];
2863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataRx = new long[4];
2873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataTx = new long[4];
2883718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataRx = new long[4];
2893718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2903718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataUptime;
2913718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataStart;
2923718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2933f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingCount;
2943f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingStart = -1;
2953f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
296f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private int mPhoneServiceState = -1;
297e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int mPhoneServiceStateRaw = -1;
298e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int mPhoneSimStateRaw = -1;
299f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
300c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
301c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
302c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
3035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private final HashMap<String, SamplingTimer> mKernelWakelockStats =
304c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, SamplingTimer>();
3055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
306c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public Map<String, ? extends SamplingTimer> getKernelWakelockStats() {
307c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mKernelWakelockStats;
308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
3095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
310c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static int sKernelWakelockUpdateVersion = 0;
3115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
312c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int[] PROC_WAKELOCKS_FORMAT = new int[] {
313c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
314c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 1: count
315c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
316c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
317c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 5: totalTime
319c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    };
3205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
321c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final String[] mProcWakelocksName = new String[3];
322c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final long[] mProcWakelocksData = new long[3];
3235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
324c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
325c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added
326c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * to mKernelWakelockStats.
327c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
3285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    private final Map<String, KernelWakelockStats> mProcWakelockFileStats =
329c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, KernelWakelockStats>();
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>();
3325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory();
3341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
3351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    /** Network ifaces that {@link ConnectivityManager} has claimed as mobile. */
3361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private HashSet<String> mMobileIfaces = Sets.newHashSet();
3371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
3401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
3410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
352e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class Counter extends BatteryStats.Counter implements Unpluggable {
3534cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        final AtomicInteger mCount = new AtomicInteger();
3546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLoadedCount;
356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLastCount;
357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mUnpluggedCount;
358617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mPluggedCount;
3595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
360617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables, Parcel in) {
3616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
3624cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = in.readInt();
3634cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLoadedCount = in.readInt();
3653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = in.readInt();
367617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables) {
3716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
373617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void writeToParcel(Parcel out) {
3764cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(mCount.get());
377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLoadedCount);
378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mUnpluggedCount);
379617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
380617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void unplug(long batteryUptime, long batteryRealtime) {
3824cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount;
3834cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
384617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
385617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void plug(long batteryUptime, long batteryRealtime) {
3874cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = mCount.get();
388617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
390617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
391617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Writes a possibly null Counter to a Parcel.
392617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
393617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param out the Parcel to be written to.
394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param counter a Counter, or null.
395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static void writeCounterToParcel(Parcel out, Counter counter) {
397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (counter == null) {
398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0); // indicates null
399617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return;
400617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
401617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(1); // indicates non-null
402617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
403617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            counter.writeToParcel(out);
404617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
405617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
406617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
407c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
408617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            int val;
409617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (which == STATS_LAST) {
410617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mLastCount;
411617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
4124cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate                val = mCount.get();
4136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
414617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mUnpluggedCount;
4156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
416617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mLoadedCount;
417617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
418617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
419617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
420617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return val;
421617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
422617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void logState(Printer pw, String prefix) {
4244cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            pw.println(prefix + "mCount=" + mCount.get()
425617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mUnpluggedCount=" + mUnpluggedCount
427617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mPluggedCount=" + mPluggedCount);
428617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4304cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        void stepAtomic() {
4314cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.incrementAndGet();
432617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
4346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
4356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this counter.
4366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
4376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void reset(boolean detachIfReset) {
4386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount.set(0);
4396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
4406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
4416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
4426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
4436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
4466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
4476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4485a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
449617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void writeSummaryFromParcelLocked(Parcel out) {
4504cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            int count = mCount.get();
4514cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(count);
452617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
453617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
454617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void readSummaryFromParcelLocked(Parcel in) {
4554cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mLoadedCount = in.readInt();
4564cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mLoadedCount);
4573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
4584cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount = mLoadedCount;
459617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
460617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
461e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
462e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class SamplingCounter extends Counter {
463e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
464e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) {
465e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables, in);
466e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
467e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
468e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables) {
469e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables);
470e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
471e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4724cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        public void addCountAtomic(long count) {
4734cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.addAndGet((int)count);
474e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
475e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
476e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
477617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static abstract class Timer extends BatteryStats.Timer implements Unpluggable {
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
4826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
4835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
4885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
4915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
4985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
5045a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
5105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
5175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
518244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        /**
519244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * Constructs from a parcel.
520244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param type
521244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param unpluggables
522244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param powerType
523244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param in
524244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         */
525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
5276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
5285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
5313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
5353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
5426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract long computeRunTimeLocked(long curBatteryRealtime);
5475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract int computeCurrentCountLocked();
5495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
5516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this timer.  Returns true if the timer is inactive
5526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * so can be completely dropped.
5536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
5549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
5556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mTotalTime = mLoadedTime = mLastTime = 0;
5566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount = mLoadedCount = mLastCount = 0;
5576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
5586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
5596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
5616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
5646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
5656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " old mTotalTime=" + mTotalTime);
595c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = computeRunTimeLocked(batteryRealtime);
597c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = computeCurrentCountLocked();
598c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType
600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + ": new mTotalTime=" + mTotalTime);
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6035a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long getTotalTimeLocked(long batteryRealtime, int which) {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
6286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
6306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                val = computeCurrentCountLocked();
6456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
6476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
655627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + " mCount=" + mCount
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
659627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
661627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
6645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
6655a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long runTime = computeRunTimeLocked(batteryRealtime);
668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Divide by 1000 for backwards compatibility
669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong((runTime + 500) / 1000);
670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount);
671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Multiply by 1000 for backwards compatibility
675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = mLoadedTime = in.readLong() * 1000;
6763bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedTime = mTotalTime;
678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = mLoadedCount = in.readInt();
6793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedCount = mCount;
681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
6835a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class SamplingTimer extends Timer {
6855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported count from /proc/wakelocks.
688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mCurrentReportedCount;
690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported count from /proc/wakelocks when unplug() was last
693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUnpluggedReportedCount;
696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported total_time from /proc/wakelocks.
6995a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh         */
700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mCurrentReportedTotalTime;
701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported total_time from /proc/wakelocks when unplug() was last
705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUnpluggedReportedTotalTime;
708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
710c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently in a discharge cycle.
711c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mInDischarge;
713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently recording reported values.
716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mTrackingReportedValues;
7185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /*
720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * A sequnce counter, incremented once for each update of the stats.
721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUpdateVersion;
7235a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
724c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) {
725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables, in);
726c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = in.readInt();
727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = in.readInt();
728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = in.readLong();
729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = in.readLong();
730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
7345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge,
735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                boolean trackReportedValues) {
736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables);
737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = trackReportedValues;
738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setStale() {
742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = false;
743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = 0;
744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = 0;
745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setUpdateVersion(int version) {
748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateVersion = version;
749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
751c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getUpdateVersion() {
752c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUpdateVersion;
753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedCount(int count) {
756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedCount == 0) {
757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = count;
759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
760c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = count;
763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
765c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedTotalTime(long totalTime) {
766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedTotalTime == 0) {
767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
768c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = totalTime;
769c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
770c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = totalTime;
773c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
775c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void unplug(long batteryUptime, long batteryRealtime) {
776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.unplug(batteryUptime, batteryRealtime);
777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mTrackingReportedValues) {
778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = mCurrentReportedCount;
780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = true;
782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.plug(batteryUptime, batteryRealtime);
786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = false;
787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
7915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
792c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
793c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
794c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
7965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
797c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
7985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            return mTotalTime + (mInDischarge && mTrackingReportedValues
799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount + (mInDischarge && mTrackingReportedValues
804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mUnpluggedReportedCount);
811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUnpluggedReportedTotalTime);
813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
8169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
8179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, detachIfReset);
8186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            setStale();
8196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
8206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
8215a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeSummaryFromParcelLocked(out, batteryRealtime);
824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
8365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /**
838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * State for keeping track of timing information.
839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class StopwatchTimer extends Timer {
8410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final Uid mUid;
842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        final ArrayList<StopwatchTimer> mTimerPool;
8430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mNesting;
845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The last time at which we updated the timer.  If mNesting is > 0,
848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * subtract this from the current battery time to find the amount of
849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * time we have been running since we last computed an update.
850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUpdateTime;
8525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
8549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The total time at which the timer was acquired, to determine if it
855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * was actually held for an interesting duration.
856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mAcquireTime;
858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
859f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        long mTimeout;
860f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
8610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        /**
8620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * For partial wake locks, keep track of whether we are in the list
8630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * to consume CPU cycles.
8640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         */
8650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean mInList;
8660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
8670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables, Parcel in) {
869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables, in);
8700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateTime = in.readLong();
873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
8750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables) {
877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables);
8780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
8815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
882f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        void setTimeout(long timeout) {
883f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mTimeout = timeout;
884f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
885f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
886c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
887c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUpdateTime);
889c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
890c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
892c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mNesting > 0) {
893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
895c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
896c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                super.plug(batteryUptime, batteryRealtime);
897c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUpdateTime = batteryRealtime;
898c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
900c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
901c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
902c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
903c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
904c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
905c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
93232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        boolean isRunningLocked() {
93332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            return mNesting > 0;
93432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
93532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                    final long realtime = SystemClock.elapsedRealtime() * 1000;
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9555a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
973c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final ArrayList<StopwatchTimer> pool) {
9745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            final long realtime = SystemClock.elapsedRealtime() * 1000;
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
978c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final StopwatchTimer t = pool.get(i);
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
987c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
988c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
989f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) {
990f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                curBatteryRealtime = mUpdateTime + mTimeout;
991f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
998c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
999c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
1000c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount;
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
10046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean canDetach = mNesting <= 0;
10059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, canDetach && detachIfReset);
10069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mNesting > 0) {
10079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mUpdateTime = stats.getBatteryRealtimeLocked(
10089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        SystemClock.elapsedRealtime() * 1000);
10099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
10109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mAcquireTime = mTotalTime;
10116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return canDetach;
10126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
10135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
10146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
10156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            super.detach();
10166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mTimerPool != null) {
10176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mTimerPool.remove(this);
10186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
10196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
10205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
1022c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10265a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1027c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> readKernelWakelockStats() {
10285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
10293372f2e259247810627fd22033406163284f4f64Johannes Carlsson        byte[] buffer = new byte[8192];
1030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int len;
10315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1032c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        try {
1033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            FileInputStream is = new FileInputStream("/proc/wakelocks");
1034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            len = is.read(buffer);
1035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            is.close();
1036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1037c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (len > 0) {
1038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                int i;
1039c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (i=0; i<len; i++) {
1040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (buffer[i] == '\0') {
1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        len = i;
1042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        break;
1043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
1044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1046c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.FileNotFoundException e) {
1047c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
1048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.IOException e) {
1049c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
1050c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
10515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1052c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return parseProcWakelocks(buffer, len);
1053c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
10545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1055c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> parseProcWakelocks(
1056c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            byte[] wlBuffer, int len) {
1057c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        String name;
1058c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int count;
1059c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long totalTime;
10601059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        int startIndex;
10611059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        int endIndex;
1062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int numUpdatedWlNames = 0;
1063c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1064c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        // Advance past the first line.
1065c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int i;
1066c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++);
1067c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        startIndex = endIndex = i + 1;
1068c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1069c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        synchronized(this) {
1070c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Map<String, KernelWakelockStats> m = mProcWakelockFileStats;
10715a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            sKernelWakelockUpdateVersion++;
1073c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            while (endIndex < len) {
10745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                for (endIndex=startIndex;
10755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                        endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0';
1076c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex++);
10773372f2e259247810627fd22033406163284f4f64Johannes Carlsson                endIndex++; // endIndex is an exclusive upper bound.
10783372f2e259247810627fd22033406163284f4f64Johannes Carlsson                // Don't go over the end of the buffer, Process.parseProcLine might
10793372f2e259247810627fd22033406163284f4f64Johannes Carlsson                // write to wlBuffer[endIndex]
10803372f2e259247810627fd22033406163284f4f64Johannes Carlsson                if (endIndex >= (len - 1) ) {
10813372f2e259247810627fd22033406163284f4f64Johannes Carlsson                    return m;
1082e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                }
1083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1084c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String[] nameStringArray = mProcWakelocksName;
1085c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                long[] wlData = mProcWakelocksData;
10862098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // Stomp out any bad characters since this is from a circular buffer
10872098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // A corruption is seen sometimes that results in the vm crashing
10882098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // This should prevent crashes and the line will probably fail to parse
10892098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                for (int j = startIndex; j < endIndex; j++) {
10902098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                    if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?';
10912098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                }
109253b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex,
109353b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                        PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null);
10942098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani
1095c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                name = nameStringArray[0];
1096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                count = (int) wlData[1];
1097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // convert nanoseconds to microseconds with rounding.
1098c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                totalTime = (wlData[2] + 500) / 1000;
1099c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
110053b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                if (parsed && name.length() > 0) {
1101c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (!m.containsKey(name)) {
11025a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                        m.put(name, new KernelWakelockStats(count, totalTime,
1103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                sKernelWakelockUpdateVersion));
1104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        numUpdatedWlNames++;
1105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    } else {
1106c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        KernelWakelockStats kwlStats = m.get(name);
1107c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        if (kwlStats.mVersion == sKernelWakelockUpdateVersion) {
1108c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount += count;
1109c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime += totalTime;
1110c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        } else {
1111c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount = count;
1112c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime = totalTime;
1113c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mVersion = sKernelWakelockUpdateVersion;
1114c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            numUpdatedWlNames++;
1115c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        }
1116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
111753b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                }
1118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                startIndex = endIndex;
1119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (m.size() != numUpdatedWlNames) {
1122c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Don't report old data.
1123c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Iterator<KernelWakelockStats> itr = m.values().iterator();
1124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                while (itr.hasNext()) {
1125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (itr.next().mVersion != sKernelWakelockUpdateVersion) {
1126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        itr.remove();
1127c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
1128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1130c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return m;
1131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1134c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private class KernelWakelockStats {
1135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mCount;
1136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long mTotalTime;
1137c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mVersion;
11385a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1139c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        KernelWakelockStats(int count, long totalTime, int version) {
1140c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = count;
1141c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = totalTime;
1142c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mVersion = version;
1143c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1144c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1146c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
11475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh     * Get the KernelWakelockTimer associated with name, and create a new one if one
1148c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * doesn't already exist.
1149c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
1150c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public SamplingTimer getKernelWakelockTimerLocked(String name) {
1151c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer kwlt = mKernelWakelockStats.get(name);
1152c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kwlt == null) {
11535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
1154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    true /* track reported values */);
1155c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mKernelWakelockStats.put(name, kwlt);
1156c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1157c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return kwlt;
1158c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataPlug(long[] dataTransfer, long currentBytes) {
11616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_LAST] = dataTransfer[STATS_SINCE_UNPLUGGED];
11626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = -1;
11633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataUnplug(long[] dataTransfer, long currentBytes) {
11666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = currentBytes;
11673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11703f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Radio uptime in microseconds when transferring data. This value is very approximate.
11713f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return
11723f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11733f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private long getCurrentRadioDataUptime() {
11743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        try {
11753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
11763718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (!awakeTimeFile.exists()) return 0;
11773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
11783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            String line = br.readLine();
11793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            br.close();
11803f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return Long.parseLong(line) * 1000;
11813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (NumberFormatException nfe) {
11823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
11833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (IOException ioe) {
11843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
11853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
11863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return 0;
11873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11883718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
11913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11923718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getRadioDataUptimeMs() {
11933f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
11943f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
11953f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
11963f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh     * Returns the duration that the cell radio was up for data transfers.
11983f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11993f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptime() {
12003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (mRadioDataStart == -1) {
12013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return mRadioDataUptime;
12023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
12033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentRadioDataUptime() - mRadioDataStart;
12043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
12053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
12063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
12073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int getCurrentBluetoothPingCount() {
12083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBtHeadset != null) {
12095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            List<BluetoothDevice> deviceList = mBtHeadset.getConnectedDevices();
12105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            if (deviceList.size() > 0) {
12115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                return mBtHeadset.getBatteryUsageHint(deviceList.get(0));
12123f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            }
12133f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
12143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return -1;
12153f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12163f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public int getBluetoothPingCount() {
12183f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBluetoothPingStart == -1) {
12193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBluetoothPingCount;
12203f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        } else if (mBtHeadset != null) {
12213f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentBluetoothPingCount() - mBluetoothPingStart;
12223f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
122382cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        return 0;
12243f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12253f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12263f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public void setBtHeadset(BluetoothHeadset headset) {
122782cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) {
122882cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani            mBluetoothPingStart = getCurrentBluetoothPingCount();
122982cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        }
12303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBtHeadset = headset;
12313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
12323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
12330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    int mChangedBufferStates = 0;
12340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void addHistoryBufferLocked(long curTime) {
12360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!mHaveBatteryLevel || !mRecordingHistory) {
12370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12401fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        final long timeDiff = (mHistoryBaseTime+curTime) - mHistoryLastWritten.time;
12410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mHistoryBufferLastPos >= 0 && mHistoryLastWritten.cmd == HistoryItem.CMD_UPDATE
12421fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                && timeDiff < 2000
12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                && ((mHistoryLastWritten.states^mHistoryCur.states)&mChangedBufferStates) == 0) {
12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // If the current is the same as the one before, then we no
12450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // longer need the entry.
12460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataSize(mHistoryBufferLastPos);
12470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(mHistoryBufferLastPos);
12480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBufferLastPos = -1;
12490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (mHistoryLastLastWritten.cmd == HistoryItem.CMD_UPDATE
12501fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    && timeDiff < 500 && mHistoryLastLastWritten.same(mHistoryCur)) {
12510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // If this results in us returning to the state written
12520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // prior to the last one, then we can just delete the last
12530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                // written one and drop the new one.  Nothing more to do.
12540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryLastWritten.setTo(mHistoryLastLastWritten);
12550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL;
12560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                return;
12570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mChangedBufferStates |= mHistoryLastWritten.states^mHistoryCur.states;
12590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            curTime = mHistoryLastWritten.time - mHistoryBaseTime;
12601fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mHistoryLastWritten.setTo(mHistoryLastLastWritten);
12610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else {
12620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mChangedBufferStates = 0;
12630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        final int dataSize = mHistoryBuffer.dataSize();
12660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (dataSize >= MAX_HISTORY_BUFFER) {
12670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (!mHistoryOverflow) {
12680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                mHistoryOverflow = true;
12690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                addHistoryBufferLocked(curTime, HistoryItem.CMD_OVERFLOW);
12700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // Once we've reached the maximum number of items, we only
12730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // record changes to the battery level and the most interesting states.
12740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // Once we've reached the maximum maximum number of items, we only
12750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            // record changes to the battery level.
12760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (mHistoryLastWritten.batteryLevel == mHistoryCur.batteryLevel &&
12770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    (dataSize >= MAX_MAX_HISTORY_BUFFER
12780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                            || ((mHistoryEnd.states^mHistoryCur.states)
12790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                                    & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
12800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                return;
12810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
12820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(curTime, HistoryItem.CMD_UPDATE);
12850ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
12860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
12870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void addHistoryBufferLocked(long curTime, byte cmd) {
12880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int origPos = 0;
12890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mIteratingHistory) {
12900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            origPos = mHistoryBuffer.dataPosition();
12910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
12920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
12930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBufferLastPos = mHistoryBuffer.dataPosition();
12940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastLastWritten.setTo(mHistoryLastWritten);
12950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur);
12960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.writeDelta(mHistoryBuffer, mHistoryLastLastWritten);
12970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mLastHistoryTime = curTime;
12980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "Writing history buffer: was " + mHistoryBufferLastPos
12990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " now " + mHistoryBuffer.dataPosition()
13000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " size is now " + mHistoryBuffer.dataSize());
13010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (mIteratingHistory) {
13020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.setDataPosition(origPos);
13030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
13040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
13050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1306f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    int mChangedStates = 0;
1307f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
13086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime) {
13090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(curTime);
13100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
1311e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
1312e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
1313e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
1314e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn
13156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (!mHaveBatteryLevel || !mRecordingHistory) {
13166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
13176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
13189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        // If the current time is basically the same as the last time,
1320f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // and no states have since the last recorded entry changed and
1321f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // are now resetting back to their original value, then just collapse
1322f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // into one record.
13239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE
1324f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+2000)
1325f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && ((mHistoryEnd.states^mHistoryCur.states)&mChangedStates) == 0) {
13269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // If the current is the same as the one before, then we no
13279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // longer need the entry.
13289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE
13291fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                    && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+500)
13309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && mHistoryLastEnd.same(mHistoryCur)) {
13319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd.next = null;
13329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.next = mHistoryCache;
13339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryCache = mHistoryEnd;
13349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd = mHistoryLastEnd;
13359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd = null;
13369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            } else {
1337f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                mChangedStates |= mHistoryEnd.states^mHistoryCur.states;
13389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, mHistoryCur);
13399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
13409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return;
13419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
13429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1343f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        mChangedStates = 0;
1344f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
1345f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        if (mNumHistoryItems == MAX_HISTORY_ITEMS
1346f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) {
13477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            addHistoryRecordLocked(curTime, HistoryItem.CMD_OVERFLOW);
13487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
13497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
13506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mNumHistoryItems >= MAX_HISTORY_ITEMS) {
13516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // Once we've reached the maximum number of items, we only
1352f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // record changes to the battery level and the most interesting states.
1353f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // Once we've reached the maximum maximum number of items, we only
13546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // record changes to the battery level.
13556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryEnd != null && mHistoryEnd.batteryLevel
1356f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    == mHistoryCur.batteryLevel &&
1357f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS
1358f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                            || ((mHistoryEnd.states^mHistoryCur.states)
1359f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                                    & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
13606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return;
13616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
13626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
13639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE);
13656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
13665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime, byte cmd) {
13686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistoryCache;
136932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (rec != null) {
137032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCache = rec.next;
137132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
13726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            rec = new HistoryItem();
137332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
13746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur);
13755a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(rec);
137732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
13785a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(HistoryItem rec) {
13806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mNumHistoryItems++;
138132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        rec.next = null;
13829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mHistoryLastEnd = mHistoryEnd;
138332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mHistoryEnd != null) {
138432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd.next = rec;
138532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd = rec;
138632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
138732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistory = mHistoryEnd = rec;
138832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
138932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
13905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
13916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void clearHistoryLocked() {
13920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "********** CLEARING HISTORY!");
1393e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (USE_OLD_HISTORY) {
1394e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            if (mHistory != null) {
1395e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn                mHistoryEnd.next = mHistoryCache;
1396e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn                mHistoryCache = mHistory;
1397e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn                mHistory = mHistoryLastEnd = mHistoryEnd = null;
1398e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            }
1399e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            mNumHistoryItems = 0;
140032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
1401e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn
14026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mHistoryBaseTime = 0;
14030ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mLastHistoryTime = 0;
14040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
14050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataSize(0);
14060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
14070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER/2);
14080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL;
14090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryLastWritten.cmd = HistoryItem.CMD_NULL;
14100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBufferLastPos = -1;
14110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryOverflow = false;
141232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
14135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
14146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doUnplugLocked(long batteryUptime, long batteryRealtime) {
14151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        NetworkStats.Entry entry = null;
14161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // Track UID data usage
14181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats uidStats = getNetworkStatsDetailGroupedByUid();
14191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final int size = uidStats.size();
14201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        for (int i = 0; i < size; i++) {
14211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            entry = uidStats.getValues(i, entry);
14221059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final Uid u = mUidStats.get(entry.uid);
14241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (u == null) continue;
14251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            u.mStartedTcpBytesReceived = entry.rxBytes;
14271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            u.mStartedTcpBytesSent = entry.txBytes;
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14311059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // Track both mobile and total overall data
14371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats ifaceStats = getNetworkStatsSummary();
14381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry, mMobileIfaces);
14391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mMobileDataRx, entry.rxBytes);
14401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mMobileDataTx, entry.txBytes);
14411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry);
14421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mTotalDataRx, entry.rxBytes);
14431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataUnplug(mTotalDataTx, entry.txBytes);
14441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
14463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataStart = getCurrentRadioDataUptime();
14473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = 0;
14481059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
14503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = getCurrentBluetoothPingCount();
14513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = 0;
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
14546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doPlugLocked(long batteryUptime, long batteryRealtime) {
14551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        NetworkStats.Entry entry = null;
14561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // Track both mobile and total overall data
14731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final NetworkStats ifaceStats = getNetworkStatsSummary();
14741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry, mMobileIfaces);
14751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mMobileDataRx, entry.rxBytes);
14761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mMobileDataTx, entry.txBytes);
14771059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        entry = ifaceStats.getTotal(entry);
14781059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mTotalDataRx, entry.rxBytes);
14791059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        doDataPlug(mTotalDataTx, entry.txBytes);
14801059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
14813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
14823f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataUptime = getRadioDataUptime();
14833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
14843f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
14853f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
14863f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = getBluetoothPingCount();
14873f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14893718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
14909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mWakeLockNesting;
14919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
14929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartWakeLocked(int uid, int pid, String name, int type) {
14931ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
14941ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // Only care about partial wake locks, since full wake locks
14951ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // will be canceled when the user puts the screen to sleep.
14961ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
14971ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG;
14981ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: "
14991ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
15001ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
15011ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
15021ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting++;
15039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
15050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
15060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
15070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
15080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type);
15109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
15129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopWakeLocked(int uid, int pid, String name, int type) {
15141ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
15151ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting--;
15161ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
15171ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG;
15181ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: "
15191ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
15201ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
15211ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
15229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
15240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
15250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
15260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
15270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type);
15299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
15319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
15337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
15347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
15357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStartWakeLocked(ws.get(i), pid, name, type);
15367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
15377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
15387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
15397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
15407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
15417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
15427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStopWakeLocked(ws.get(i), pid, name, type);
15437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
15447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
15457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
15460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public int startAddingCpuLocked() {
15470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler.removeMessages(MSG_UPDATE_WAKELOCKS);
15480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (mScreenOn) {
15500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
15510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
15540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (N == 0) {
15550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.clear();
15560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
15570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // How many timers should consume CPU?  Only want to include ones
15600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // that have already been in the list.
15610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
15620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
15630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (st.mInList) {
15640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = st.mUid;
15650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // We don't include the system UID, because it so often
15660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // holds wake locks at one request or another of an app.
15670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null && uid.mUid != Process.SYSTEM_UID) {
15680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    return 50;
15690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
15700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
15720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        return 0;
15740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
15750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
15760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void finishAddingCpuLocked(int perc, int utime, int stime, long[] cpuSpeedTimes) {
15770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
15780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (perc != 0) {
15790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            int num = 0;
15800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<N; i++) {
15810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                StopwatchTimer st = mPartialTimers.get(i);
15820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (st.mInList) {
15830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid uid = st.mUid;
15840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // We don't include the system UID, because it so often
15850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // holds wake locks at one request or another of an app.
15860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (uid != null && uid.mUid != Process.SYSTEM_UID) {
15870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        num++;
15880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
15890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
15900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
15910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (num != 0) {
15920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                for (int i=0; i<N; i++) {
15930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    StopwatchTimer st = mPartialTimers.get(i);
15940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (st.mInList) {
15950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        Uid uid = st.mUid;
15960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        if (uid != null && uid.mUid != Process.SYSTEM_UID) {
1597618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int myUTime = utime/num;
1598618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int mySTime = stime/num;
1599618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            utime -= myUTime;
1600618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            stime -= mySTime;
1601618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            num--;
16020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*");
16030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addCpuTimeLocked(myUTime, mySTime);
16040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addSpeedStepTimes(cpuSpeedTimes);
16050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        }
16060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
16070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
16080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            // Just in case, collect any lost CPU time.
16110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (utime != 0 || stime != 0) {
16120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = getUidStatsLocked(Process.SYSTEM_UID);
16130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null) {
16140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid.Proc proc = uid.getProcessStatsLocked("*lost*");
16150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addCpuTimeLocked(utime, stime);
16160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addSpeedStepTimes(cpuSpeedTimes);
16170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
16180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int NL = mLastPartialTimers.size();
16220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean diff = N != NL;
16230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL && !diff; i++) {
16240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i);
16250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (!diff) {
16270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<NL; i++) {
16280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mPartialTimers.get(i).mInList = true;
16290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
16300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return;
16310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL; i++) {
16340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.get(i).mInList = false;
16350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mLastPartialTimers.clear();
16370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
16380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
16390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            st.mInList = true;
16400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.add(st);
16410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
16420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
16430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
16449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteProcessDiedLocked(int uid, int pid) {
16459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.mPids.remove(pid);
16489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public long getProcessWakeTime(int uid, int pid, long realtime) {
16529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Uid.Pid p = u.mPids.get(pid);
16559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
16569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return p.mWakeSum + (p.mWakeStart != 0 ? (realtime - p.mWakeStart) : 0);
16579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
16589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return 0;
16609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) {
16639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
16649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
16659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.reportExcessiveWakeLocked(proc, overTime, usedTime);
16669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1669287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) {
1670287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        Uid u = mUidStats.get(uid);
1671287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        if (u != null) {
1672287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            u.reportExcessiveCpuLocked(proc, overTime, usedTime);
1673287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
1674287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    }
1675287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
16769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mSensorNesting;
16779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartSensorLocked(int uid, int sensor) {
16799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
16809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG;
16819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: "
16829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting++;
16869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStartSensor(sensor);
16879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
16899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopSensorLocked(int uid, int sensor) {
16909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting--;
16919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
16929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG;
16939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: "
16949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
16979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStopSensor(sensor);
16989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
16999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
170032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mGpsNesting;
17015a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStartGpsLocked(int uid) {
170332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
17046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG;
170532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: "
170632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
170832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
170932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting++;
17102e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStartGps();
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStopGpsLocked(int uid) {
171432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting--;
171532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
17166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG;
171732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: "
171832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
172032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
17212e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStopGps();
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
17266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG;
172732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: "
172832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
1732617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1733617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this);
1734617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
17359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
17369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // Fake a wake lock, so we consider the device waked as long
17379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // as the screen is on.
17381ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1739c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
1740c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            // Update discharge amounts.
1741c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBatteryInternal) {
174232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                updateDischargeScreenLevelsLocked(false, true);
1743c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17465a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
17496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG;
175032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: "
175132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
1755617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1756617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1757617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
17589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
17591ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1760c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
1761c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            // Update discharge amounts.
1762c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBatteryInternal) {
176332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                updateDischargeScreenLevelsLocked(true, false);
1764c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
1765617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1766617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1768617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightnessLocked(int brightness) {
1769617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Bin the brightness.
1770617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
1771617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (bin < 0) bin = 0;
1772617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
1773617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mScreenBrightnessBin != bin) {
17746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK)
17756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT);
177632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: "
177732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1779617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenOn) {
1780617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (mScreenBrightnessBin >= 0) {
1781617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1782617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1783617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[bin].startRunningLocked(this);
1784617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1785617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessBin = bin;
1786617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1787617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17894cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate    public void noteInputEventAtomic() {
17904cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        mInputEventCounter.stepAtomic();
1791617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
17925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1793617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivityLocked(int uid, int event) {
17942e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteUserActivityLocked(event);
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
17993bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG;
180032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: "
180132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
18103bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG;
181132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: "
181232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
181832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
18193bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void stopAllSignalStrengthTimersLocked(int except) {
18205284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
18213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (i == except) {
18223bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                continue;
18233bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
18243bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) {
18253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalStrengthsTimer[i].stopRunningLocked(this);
18263bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
18273bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
18283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
18293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1830e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private int fixPhoneServiceState(int state, int signalBin) {
1831e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (mPhoneSimStateRaw == TelephonyManager.SIM_STATE_ABSENT) {
1832e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // In this case we will always be STATE_OUT_OF_SERVICE, so need
1833e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // to infer that we are scanning from other data.
1834e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (state == ServiceState.STATE_OUT_OF_SERVICE
18355284090631e638b916d9a453212e9dc802656a67Wink Saville                    && signalBin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
1836e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                state = ServiceState.STATE_IN_SERVICE;
1837e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1838e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1839e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1840e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return state;
1841e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
1842e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1843e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private void updateAllPhoneStateLocked(int state, int simState, int bin) {
18443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        boolean scanning = false;
1845e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        boolean newHistory = false;
18463bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1847e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneServiceStateRaw = state;
1848e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneSimStateRaw = simState;
1849e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        mPhoneSignalStrengthBinRaw = bin;
1850e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1851e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (simState == TelephonyManager.SIM_STATE_ABSENT) {
1852e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // In this case we will always be STATE_OUT_OF_SERVICE, so need
1853e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // to infer that we are scanning from other data.
1854e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (state == ServiceState.STATE_OUT_OF_SERVICE
18555284090631e638b916d9a453212e9dc802656a67Wink Saville                    && bin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
1856e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                state = ServiceState.STATE_IN_SERVICE;
1857e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1858e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
18593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
18603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If the phone is powered off, stop all timers.
18613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (state == ServiceState.STATE_POWER_OFF) {
1862e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            bin = -1;
1863f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1864e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        // If we are in service, make sure the correct signal string timer is running.
1865e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else if (state == ServiceState.STATE_IN_SERVICE) {
1866e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // Bin will be changed below.
18673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
18683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If we're out of service, we are in the lowest signal strength
18693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // bin and have the scanning bit set.
1870f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        } else if (state == ServiceState.STATE_OUT_OF_SERVICE) {
18713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            scanning = true;
18725284090631e638b916d9a453212e9dc802656a67Wink Saville            bin = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1873f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalScanningTimer.isRunningLocked()) {
18746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG;
1875e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
18766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: "
18776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1878f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalScanningTimer.startRunningLocked(this);
1879f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1880f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
18815a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
18823bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (!scanning) {
18833bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            // If we are no longer scanning, then stop the scanning timer.
18843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (mPhoneSignalScanningTimer.isRunningLocked()) {
18853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG;
18863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: "
18873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1888e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
18893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalScanningTimer.stopRunningLocked(this);
18903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
18913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
18923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
189332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mPhoneServiceState != state) {
18946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK)
18956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (state << HistoryItem.STATE_PHONE_STATE_SHIFT);
1896e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + state + " to: "
189732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
1898e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            newHistory = true;
189932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mPhoneServiceState = state;
190032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
1901e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1902e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
1903e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
1904e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
1905e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1906e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (bin >= 0) {
1907e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) {
1908e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1909e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                }
1910e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_SIGNAL_STRENGTH_MASK)
1911e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        | (bin << HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT);
1912e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: "
1913e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
1914e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                newHistory = true;
1915e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            } else {
1916e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                stopAllSignalStrengthTimersLocked(-1);
1917e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1918e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mPhoneSignalStrengthBin = bin;
1919e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1920e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1921e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (newHistory) {
1922e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1923e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
1924e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
1925e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
1926e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    /**
1927e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * Telephony stack updates the phone state.
1928e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * @param state phone state from ServiceState.getState()
1929e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     */
1930e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    public void notePhoneStateLocked(int state, int simState) {
1931e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        updateAllPhoneStateLocked(state, simState, mPhoneSignalStrengthBinRaw);
193232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
193332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1934e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
1935627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
19365284090631e638b916d9a453212e9dc802656a67Wink Saville        int bin = signalStrength.getLevel();
1937e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        updateAllPhoneStateLocked(mPhoneServiceStateRaw, mPhoneSimStateRaw, bin);
1938627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
19395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
1940627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
1941627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
1942627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
1943627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
1944627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
1945627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
1946627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1947627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
1948627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
1949627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1950627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
1951627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
1952627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
19536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_CDMA:
19546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_CDMA;
19556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_0:
19576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_0;
19586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_A:
19606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_A;
19616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_1xRTT:
19636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_1xRTT;
19646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSDPA:
19666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSDPA;
19676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSUPA:
19696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSUPA;
19706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSPA:
19726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSPA;
19736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_IDEN:
19756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_IDEN;
19766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
19776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_B:
19786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_B;
19796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
1980962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                case TelephonyManager.NETWORK_TYPE_LTE:
1981962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    bin = DATA_CONNECTION_LTE;
1982962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    break;
1983962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                case TelephonyManager.NETWORK_TYPE_EHRPD:
1984962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    bin = DATA_CONNECTION_EHRPD;
1985962a990a45a2a9f9c3002064e71f9c2fed86acf1Robert Greenwalt                    break;
1986627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
1987627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
1988627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1989627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1990627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
19913718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData);
1992627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
19936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK)
19946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT);
199532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: "
199632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1998627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
1999627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
2000627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
2001627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
2002627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
2003627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2004627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
20055a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
200658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOnLocked() {
2007105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
20086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG;
200932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: "
201032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2012105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
2013105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
2014105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2015105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
20165a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
201758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOffLocked() {
2018105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
20196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG;
202032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: "
202132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2023105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
2024105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
2025105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2026617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid >= 0) {
202758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked();
2028617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = -1;
2029617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2030105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2031244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2032244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOnLocked(int uid) {
2033244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mAudioOn) {
20346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG;
203532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: "
203632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2038244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = true;
2039244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.startRunningLocked(this);
2040244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20412e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOnLocked();
2042244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
20435a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2044244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOffLocked(int uid) {
2045244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mAudioOn) {
20466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG;
204732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: "
204832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2050244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = false;
2051244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.stopRunningLocked(this);
2052244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20532e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOffLocked();
2054244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
2055244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2056244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOnLocked(int uid) {
2057244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mVideoOn) {
20586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG;
205932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: "
206032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2062244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = true;
2063244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.startRunningLocked(this);
2064244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20652e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOnLocked();
2066244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
20675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2068244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOffLocked(int uid) {
2069244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mVideoOn) {
20706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG;
207132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: "
207232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2074244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = false;
2075244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.stopRunningLocked(this);
2076244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
20772e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOffLocked();
2078244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
2079244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
208058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningLocked(WorkSource ws) {
208158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (!mGlobalWifiRunning) {
20826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG;
208332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: "
208432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
208658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = true;
208758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.startRunningLocked(this);
208858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
208958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
209058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiRunningLocked();
209158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
209258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
209358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running");
2094d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
2095d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2096d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
209758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) {
209858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
209958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = oldWs.size();
210058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
210158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked();
210258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
210358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            N = newWs.size();
210458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
210558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked();
210658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
210758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
210858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running");
210958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
211058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
211158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
211258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStoppedLocked(WorkSource ws) {
211358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
21146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RUNNING_FLAG;
211532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: "
211632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
211858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = false;
211958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.stopRunningLocked(this);
212058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
212158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
212258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked();
212358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
212458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
212558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running");
2126d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
2127d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2128d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2129105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
2130105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
21316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG;
213232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: "
213332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2135105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
2136105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
2137105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2138105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
21395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2140105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
2141105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
21426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG;
214332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: "
214432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
2146105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
2147105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
2148105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2149105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
21505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
215132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiFullLockNesting = 0;
21525a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2153105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
215432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
21556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
215632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: "
215732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
215932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
216032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting++;
21612e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked();
2162105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2163105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2164105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
216532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting--;
216632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
21676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
216832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: "
216932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
217132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
21722e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockReleasedLocked();
2173105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2174105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
217532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiScanLockNesting = 0;
21765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2177105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
217832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
21796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
218032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: "
218132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
218332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
218432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting++;
21852e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked();
2186105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2187105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2188105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
218932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting--;
219032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
21916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
219232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: "
219332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
21946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
219532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
21962e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockReleasedLocked();
2197105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
21985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
219932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiMulticastNesting = 0;
22005a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabledLocked(int uid) {
220232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
22036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
220432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: "
220532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
22066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
220732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
220832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting++;
22092e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastEnabledLocked();
22105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
22115347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
22125347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabledLocked(int uid) {
221332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting--;
221432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
22156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
221632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: "
221732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
22186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
221932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
22202e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastDisabledLocked();
22215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
22225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
22237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) {
22247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockAcquiredLocked(ws.get(i));
22277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) {
22317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockReleasedLocked(ws.get(i));
22347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteScanWifiLockAcquiredFromSourceLocked(WorkSource ws) {
22387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteScanWifiLockAcquiredLocked(ws.get(i));
22417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteScanWifiLockReleasedFromSourceLocked(WorkSource ws) {
22457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteScanWifiLockReleasedLocked(ws.get(i));
22487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) {
22527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastEnabledLocked(ws.get(i));
22557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) {
22597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
22607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
22617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastDisabledLocked(ws.get(i));
22627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
22637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
22647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
22651059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    public void noteNetworkInterfaceTypeLocked(String iface, int networkType) {
22661059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        if (ConnectivityManager.isNetworkTypeMobile(networkType)) {
22671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            mMobileIfaces.add(iface);
22681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        } else {
22691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            mMobileIfaces.remove(iface);
22701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
22711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
22721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
2274c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which);
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public long getScreenBrightnessTime(int brightnessBin,
2278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which) {
2279c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
2280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                batteryRealtime, which);
2281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
2282244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getInputEventCount(int which) {
2284c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mInputEventCounter.getCountLocked(which);
2285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
22865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
2288c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which);
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2290244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2291627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
2292627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2293c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
2294627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2295627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
2296f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2297f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    @Override public long getPhoneSignalScanningTime(
2298f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            long batteryRealtime, int which) {
2299f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        return mPhoneSignalScanningTimer.getTotalTimeLocked(
2300f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                batteryRealtime, which);
2301f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
2302f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2303617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneSignalStrengthCount(int dataType, int which) {
2304c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
23065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
2308627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
2310627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2311627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
23125a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2313617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneDataConnectionCount(int dataType, int which) {
2314c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2315617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
23165a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2317105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
2318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which);
2319105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
23205a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
232158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) {
232258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2323d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2324d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2325105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
2326c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which);
2327105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
23285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
23415a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
23495a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
23545a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
235558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        boolean mWifiRunning;
235658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        StopwatchTimer mWifiRunningTimer;
23575a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2358105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
2359c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mFullWifiLockTimer;
23605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
2362c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mScanWifiLockTimer;
23635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        boolean mWifiMulticastEnabled;
23655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        StopwatchTimer mWifiMulticastTimer;
23665a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2367244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mAudioTurnedOn;
2368244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mAudioTurnedOnTimer;
23695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2370244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mVideoTurnedOn;
2371244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mVideoTurnedOnTimer;
23725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
2373617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter[] mUserActivityCounters;
23745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
23945a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
23959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        /**
23969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The transient wake stats we have collected for this uid's pids.
23979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         */
23989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        final SparseArray<Pid> mPids = new SparseArray<Pid>();
23999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
240258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
240358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimers, mUnpluggables);
24040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
240558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mFullWifiLockTimers, mUnpluggables);
24060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
240758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mScanWifiLockTimers, mUnpluggables);
24080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
240958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiMulticastTimers, mUnpluggables);
24100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
24110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables);
24120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
24135347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables);
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2435eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2436eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2440eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2441eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
24476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
24496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24555a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
24571059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final long uidRxBytes = getNetworkStatsDetailGroupedByUid().getTotal(
24581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    null, mUid).rxBytes;
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
24601059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    ? (uidRxBytes - mStartedTcpBytesReceived) : 0);
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2462eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2463eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
24696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
24716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24775a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2478105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
247958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiRunningLocked() {
248058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (!mWifiRunning) {
248158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = true;
248258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer == null) {
248358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
248458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiRunningTimers, mUnpluggables);
24856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
248658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this);
2487617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2488617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
24895a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2490617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
249158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiStoppedLocked() {
249258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunning) {
249358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = false;
249458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this);
2495617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2496617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
24975a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2498617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2499105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
2500105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
2501105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
25026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer == null) {
25030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
250458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mFullWifiLockTimers, mUnpluggables);
25056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
2506105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
2507105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2508105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25095a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2510105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2511105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
2512105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
2513105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
2514105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
2515105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2516105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2518105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2519105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
2520105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
2521105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
25226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mScanWifiLockTimer == null) {
25230d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
252458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mScanWifiLockTimers, mUnpluggables);
25256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
2526105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
2527105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2528105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2530105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2531105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
2532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
2533105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
2534105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
2535105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2536105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
25375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
25395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastEnabledLocked() {
25405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (!mWifiMulticastEnabled) {
25415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = true;
25426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer == null) {
25430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
254458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiMulticastTimers, mUnpluggables);
25456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this);
25475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
25485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
25495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
25515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastDisabledLocked() {
25525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (mWifiMulticastEnabled) {
25535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = false;
25545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this);
25555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
25565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
25575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOnLocked() {
25606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mAudioTurnedOn) {
25616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = true;
25626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer == null) {
25630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
25646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
25656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
25676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2568617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2569244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
25706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOffLocked() {
25726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOn) {
25736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = false;
25746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
25756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
25776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOnLocked() {
25806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mVideoTurnedOn) {
25816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = true;
25826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer == null) {
25830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
25846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
25856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
25876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
25896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
25916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOffLocked() {
25926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOn) {
25936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = false;
25946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
25956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2596244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2597244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
25985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
259958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public long getWifiRunningTime(long batteryRealtime, int which) {
260058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer == null) {
26016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
260358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2604244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2605244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
26065a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
2607105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
26086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer == null) {
26096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
2612105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
26135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
26145a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
2615105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
26166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer == null) {
26176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
2620105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
26215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
26225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
26235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public long getWifiMulticastTime(long batteryRealtime, int which) {
26246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer == null) {
26256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime,
26285347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                          which);
26295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
26305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
26315a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
26326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getAudioTurnedOnTime(long batteryRealtime, int which) {
26336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer == null) {
26346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
26376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
26386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
26395a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh        @Override
26406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getVideoTurnedOnTime(long batteryRealtime, int which) {
26416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer == null) {
26426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
26436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
26456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
26466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
2647617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2648617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteUserActivityLocked(int type) {
2649617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2650617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                initUserActivityLocked();
2651617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2652617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (type < 0) type = 0;
2653617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1;
26544cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUserActivityCounters[type].stepAtomic();
2655617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26565a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2657617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2658617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
2659617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
2660617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2662617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2663617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
2664617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2665617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
2666617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
2668617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26695a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
2670617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
2671617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2672617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2673617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
2674617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2675617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
26765a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
26781059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            final long uidTxBytes = getNetworkStatsDetailGroupedByUid().getTotal(
26791059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    null, mUid).txBytes;
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
26811059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    ? (uidTxBytes - mStartedTcpBytesSent) : 0);
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2683244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
26846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
26856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear all stats for this uid.  Returns true if the uid is completely
26866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * inactive so can be dropped.
26876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
26886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        boolean reset() {
26896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean active = false;
26905a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
269158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
269258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false);
269358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= mWifiRunning;
26946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
26969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false);
26976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mFullWifiLockOut;
26986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer != null) {
27009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mScanWifiLockTimer.reset(BatteryStatsImpl.this, false);
27016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mScanWifiLockOut;
27026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
27049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false);
27056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mWifiMulticastEnabled;
27066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
27089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false);
27096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mAudioTurnedOn;
27106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
27129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false);
27136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mVideoTurnedOn;
27146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27155a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0;
27176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0;
27185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
27206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
27216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUserActivityCounters[i].reset(false);
27226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
27256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWakelockStats.size() > 0) {
27266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator();
27276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Wakelock> wakelockEntry = it.next();
27296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Wakelock wl = wakelockEntry.getValue();
27306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (wl.reset()) {
27316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
27326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
27336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
27346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mSensorStats.size() > 0) {
27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator();
27396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<Integer, Sensor> sensorEntry = it.next();
27416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Sensor s = sensorEntry.getValue();
27426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (s.reset()) {
27436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
27446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
27456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
27466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mProcessStats.size() > 0) {
27506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator();
27516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Proc> procEntry = it.next();
27536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    procEntry.getValue().detach();
27546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mProcessStats.clear();
27566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mPids.size() > 0) {
27589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; !active && i<mPids.size(); i++) {
27599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    Pid pid = mPids.valueAt(i);
27609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    if (pid.mWakeStart != 0) {
27619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        active = true;
27629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    }
27639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
27649adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
27656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mPackageStats.size() > 0) {
27666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator();
27676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
27686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Pkg> pkgEntry = it.next();
27696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Pkg p = pkgEntry.getValue();
27706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    p.detach();
27716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (p.mServiceStats.size() > 0) {
27726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        Iterator<Map.Entry<String, Pkg.Serv>> it2
27736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                                = p.mServiceStats.entrySet().iterator();
27746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        while (it2.hasNext()) {
27756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            Map.Entry<String, Pkg.Serv> servEntry = it2.next();
27766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            servEntry.getValue().detach();
27776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
27786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
27796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mPackageStats.clear();
27816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27825a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
27839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPids.clear();
27849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
27856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!active) {
278658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer != null) {
278758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer.detach();
27886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer != null) {
27906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mFullWifiLockTimer.detach();
27916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mScanWifiLockTimer != null) {
27936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mScanWifiLockTimer.detach();
27946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer != null) {
27966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mWifiMulticastTimer.detach();
27976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
27986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer != null) {
27996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mAudioTurnedOnTimer.detach();
28006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer != null) {
28026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mVideoTurnedOnTimer.detach();
28036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mUserActivityCounters != null) {
28056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
28066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUserActivityCounters[i].detach();
28076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
28086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28105a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return !active;
28126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
28135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28425a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
284958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
28506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
285158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.writeToParcel(out, batteryRealtime);
28526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
2853617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
28546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
28566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
2858617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
28596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer != null) {
28626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
28646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
28686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer.writeToParcel(out, batteryRealtime);
28706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
28746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime);
28766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
28806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
28816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime);
28826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
28846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
2886617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
2887617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2888617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
2889617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
28906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
28916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
2892617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
2902c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                // We will just drop some random set of wakelocks if
2903c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                // the previous run of the system was an older version
2904c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                // that didn't impose a limit.
2905c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                mWakelockStats.put(wakelockName, wakelock);
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
294158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunning = false;
29426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
294358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
294458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiRunningTimers, mUnpluggables, in);
29456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
294658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = null;
29476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2948105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
29496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
295158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mFullWifiLockTimers, mUnpluggables, in);
29526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer = null;
29546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2955105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
29566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
295858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mScanWifiLockTimers, mUnpluggables, in);
29596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mScanWifiLockTimer = null;
29616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastEnabled = false;
29636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
296558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiMulticastTimers, mUnpluggables, in);
2966617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
29676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer = null;
29686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mAudioTurnedOn = false;
29706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
29726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
29736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer = null;
29756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mVideoTurnedOn = false;
29776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
29780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
29796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
29806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer = null;
29826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
29836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
2984617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2985617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2986617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
2987617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
29886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
29896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUserActivityCounters = null;
2990617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3000c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3005c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3010c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
3019c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, type, pool, unpluggables, in);
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
30296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                boolean wlactive = false;
30306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerFull != null) {
30319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false);
30326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerPartial != null) {
30349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false);
30356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerWindow != null) {
30379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false);
30386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (!wlactive) {
30406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerFull != null) {
30416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull.detach();
30426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull = null;
30436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerPartial != null) {
30456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial.detach();
30466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial = null;
30476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerWindow != null) {
30496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow.detach();
30506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow = null;
30516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return !wlactive;
30546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30555a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
3084c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
30855a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3090c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
3098c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in);
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
31059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (mTimer.reset(BatteryStatsImpl.this, true)) {
31066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mTimer = null;
31076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return true;
31086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
31096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return false;
31106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
31115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3124eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3125eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3151eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Amount of time the process was running in the foreground.
3152eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3153eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mForegroundTime;
3154eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3155eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3171eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from a previous save.
3172eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3173eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLoadedForegroundTime;
3174eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3175eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
3191eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from the previous run
3192eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3193eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLastForegroundTime;
3194eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3195eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3210eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
3211eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time since unplugged.
3212eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
3213eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mUnpluggedForegroundTime;
3214eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3215e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            SamplingCounter[] mSpeedBins;
3216e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3217287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            ArrayList<ExcessivePower> mExcessivePower;
32189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
3221e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[getCpuSpeedSteps()];
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3223e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
3228eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = mForegroundTime;
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32335a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
32346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
32356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
32366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i = 0; i < mSpeedBins.length; i++) {
32376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
32386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
32396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUnpluggables.remove(c);
32406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = null;
32416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
32426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
32436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
32445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
3245287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public int countExcessivePowers() {
3246287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                return mExcessivePower != null ? mExcessivePower.size() : 0;
32479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3249287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public ExcessivePower getExcessivePower(int i) {
3250287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower != null) {
3251287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    return mExcessivePower.get(i);
32529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return null;
32549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            public void addExcessiveWake(long overTime, long usedTime) {
3257287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3258287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
32599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
3260287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3261287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_WAKE;
32629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.overTime = overTime;
32639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.usedTime = usedTime;
3264287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
32659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3267287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public void addExcessiveCpu(long overTime, long usedTime) {
3268287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3269287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
3270287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                }
3271287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3272287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_CPU;
3273287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.overTime = overTime;
3274287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.usedTime = usedTime;
3275287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
3276287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
3277287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
3278287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            void writeExcessivePowerToParcelLocked(Parcel out) {
3279287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
32809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeInt(0);
32819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    return;
32829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3284287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                final int N = mExcessivePower.size();
32859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                out.writeInt(N);
32869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3287287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = mExcessivePower.get(i);
3288287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    out.writeInt(ew.type);
32899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.overTime);
32909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.usedTime);
32919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
32929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
32939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
32947b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            boolean readExcessivePowerFromParcelLocked(Parcel in) {
32959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                final int N = in.readInt();
32969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (N == 0) {
3297287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = null;
32987b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return true;
32999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
33017b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (N > 10000) {
33027b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many excessive power entries " + N);
33037b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return false;
33047b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
33057b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn
3306287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower = new ArrayList<ExcessivePower>();
33079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3308287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = new ExcessivePower();
3309287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ew.type = in.readInt();
33109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.overTime = in.readLong();
33119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.usedTime = in.readLong();
3312287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower.add(ew);
33139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
33147b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                return true;
33159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
33169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
3320eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mForegroundTime);
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
3324eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLoadedForegroundTime);
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
3328eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mUnpluggedForegroundTime);
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
3330e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3331e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                out.writeInt(mSpeedBins.length);
3332e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
33336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
33346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
33356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(1);
33366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.writeToParcel(out);
33376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
33386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(0);
33396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3340e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
33419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3342287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                writeExcessivePowerToParcelLocked(out);
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
3348eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime = in.readLong();
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
3352eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLoadedForegroundTime = in.readLong();
33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
33543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastUserTime = 0;
33553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastSystemTime = 0;
33563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastForegroundTime = 0;
33573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastStarts = 0;
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
3360eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = in.readLong();
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
3362e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3363e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                int bins = in.readInt();
33646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                int steps = getCpuSpeedSteps();
33656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps];
3366e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < bins; i++) {
33676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (in.readInt() != 0) {
33686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = new SamplingCounter(mUnpluggables, in);
33696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3370e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
33719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3372287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                readExcessivePowerFromParcelLocked(in);
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3384eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public void addForegroundTimeLocked(long ttime) {
3385eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime += ttime;
3386eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3387eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
34016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
34176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
3425eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public long getForegroundTime(int which) {
3426eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                long val;
3427eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                if (which == STATS_LAST) {
3428eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mLastForegroundTime;
3429eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                } else {
3430eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mForegroundTime;
3431eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    if (which == STATS_CURRENT) {
3432eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mLoadedForegroundTime;
34336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
3434eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mUnpluggedForegroundTime;
3435eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    }
3436eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                }
3437eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                return val;
3438eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3439eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3440eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
34496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3455e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3456e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /* Called by ActivityManagerService when CPU times are updated. */
3457e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public void addSpeedStepTimes(long[] values) {
3458e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length && i < values.length; i++) {
34596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    long amt = values[i];
34606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (amt != 0) {
34616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        SamplingCounter c = mSpeedBins[i];
34626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        if (c == null) {
34636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            mSpeedBins[i] = c = new SamplingCounter(mUnpluggables);
34646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
34656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.addCountAtomic(values[i]);
34666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3467e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3468e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
3469e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3470e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            @Override
3471e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public long getTimeAtCpuSpeedStep(int speedStep, int which) {
3472e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                if (speedStep < mSpeedBins.length) {
34736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[speedStep];
34746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return c != null ? c.getCountLocked(which) : 0;
3475e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                } else {
3476e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return 0;
3477e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3478e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35175a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35245a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
35266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
35276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
35285a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
35323bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastWakeups = 0;
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
35746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36795a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36885a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
36896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                void detach() {
36906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUnpluggables.remove(this);
36916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
36925a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
37053bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStartTime = 0;
37063bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStarts = 0;
37073bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastLaunches = 0;
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
37946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
38116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
38286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
38579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3864b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        public SparseArray<? extends Pid> getPidStats() {
3865b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            return mPids;
3866b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        }
38675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
38689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public Pid getPidStatsLocked(int pid) {
38699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Pid p = mPids.get(pid);
38709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p == null) {
38719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p = new Pid();
38729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mPids.put(pid, p);
38739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
38749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return p;
38759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
38769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
38779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
38799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
38829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
39079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
3909c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                final int N = mWakelockStats.size();
3910c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                if (N > MAX_WAKELOCKS_PER_UID && (mUid != Process.SYSTEM_UID
3911c24ab866b0d46685f6ddd340b9c84375cf8d6831Dianne Hackborn                        || N > MAX_WAKELOCKS_PER_UID_IN_SYSTEM)) {
39129e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    name = BATCHED_WAKELOCK_NAME;
39139e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = mWakelockStats.get(name);
39149e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
39159e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (wl == null) {
39169e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = new Wakelock();
39179e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(name, wl);
39189e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3920c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39250d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL,
39260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mPartialTimers, mUnpluggables);
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL,
39340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mFullTimers, mUnpluggables);
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
39410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW,
39420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mWindowTimers, mUnpluggables);
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3951c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
39589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
39599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3960c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
39619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
39639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
39659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
3966c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
39679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
39689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables);
39709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
39719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStartWakeLocked(int pid, String name, int type) {
3975c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
39769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
39789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39791ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
39809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = getPidStatsLocked(pid);
3981b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p.mWakeStart == 0) {
3982b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                    p.mWakeStart = SystemClock.elapsedRealtime();
3983b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                }
39849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStopWakeLocked(int pid, String name, int type) {
3988c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39921ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
39939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = mPids.get(pid);
3994b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p != null && p.mWakeStart != 0) {
39959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart;
39969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeStart = 0;
39979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
39989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
39999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
40009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
40019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) {
40029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Proc p = getProcessStatsLocked(proc);
40039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
40049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p.addExcessiveWake(overTime, usedTime);
40059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4008287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) {
4009287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            Proc p = getProcessStatsLocked(proc);
4010287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            if (p != null) {
4011287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                p.addExcessiveCpu(overTime, usedTime);
4012287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
4013287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
4014287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
4016c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40195a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
4024c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
40275a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40295a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
4031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
40345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh            }
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
4038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
4041244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
40501afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = new JournaledFile(new File(filename), new File(filename + ".tmp"));
40510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = new MyHandler();
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
40530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables);
4054617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
40550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables);
4056617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4057617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
40580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables);
40595284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
40600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables);
4061627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
40620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables);
4063627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
40640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables);
4065627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
40660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables);
406758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables);
40680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables);
40690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables);
40700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables);
40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
40726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
40769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
4079633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
40806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = 0;
4081633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
4082c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
40830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
40871afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
40880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
40890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        clearHistoryLocked();
40909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
40919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void setCallback(BatteryCallback cb) {
40940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mCallback = cb;
40950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
40960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
4097e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public void setNumSpeedSteps(int steps) {
4098e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (sNumSpeedSteps == 0) sNumSpeedSteps = steps;
4099e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4100e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4101f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void setRadioScanningTimeout(long timeout) {
4102f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneSignalScanningTimer != null) {
4103f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.setTimeout(timeout);
4104f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
4105f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
4106f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
41070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingOldHistoryLocked() {
41090ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
41100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
41110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
41121fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        mHistoryReadTmp.clear();
41130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
41140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
4115ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return (mHistoryIterator = mHistory) != null;
4116ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4117ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
41180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextOldHistoryLocked(HistoryItem out) {
41200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize();
41210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!end) {
41221fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mHistoryReadTmp.readDelta(mHistoryBuffer);
41231fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW;
41240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4125ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        HistoryItem cur = mHistoryIterator;
4126ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (cur == null) {
41270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (!mReadOverflow && !end) {
41280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "Old history ends before new history!");
41290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
4130ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return false;
4131ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4132ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        out.setTo(cur);
4133ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mHistoryIterator = cur.next;
41340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (!mReadOverflow) {
41350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (end) {
41360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                Slog.w(TAG, "New history ends before old history!");
41371fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            } else if (!out.same(mHistoryReadTmp)) {
41380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                long now = getHistoryBaseTime() + SystemClock.elapsedRealtime();
41390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                PrintWriter pw = new PrintWriter(new LogWriter(android.util.Log.WARN, TAG));
41400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Histories differ!");
41410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("Old history:");
41420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, out, now);
41430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                pw.println("New history:");
41441fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn                (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, now);
41450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            }
41460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
4147ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return true;
4148ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4149ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
41510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingOldHistoryLocked() {
41520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
41530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
41540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean startIteratingHistoryLocked() {
41580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
41590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + " pos=" + mHistoryBuffer.dataPosition());
41600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
41610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mReadOverflow = false;
41620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = true;
41630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return mHistoryBuffer.dataSize() > 0;
41640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public boolean getNextHistoryLocked(HistoryItem out) {
41681fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        final int pos = mHistoryBuffer.dataPosition();
41691fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        if (pos == 0) {
41701fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn            out.clear();
41711fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        }
41721fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        boolean end = pos >= mHistoryBuffer.dataSize();
41730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (end) {
41740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return false;
41750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
41760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41771fadab5c36445bb9f0997904dbce44f8e234f847Dianne Hackborn        out.readDelta(mHistoryBuffer);
41780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        return true;
41790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
41800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
41810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    @Override
41820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void finishIteratingHistoryLocked() {
41830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mIteratingHistory = false;
41840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
418532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
41865a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
418732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    @Override
4188b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    public long getHistoryBaseTime() {
4189b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        return mHistoryBaseTime;
4190b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    }
41915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4192b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    @Override
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public boolean isScreenOn() {
42029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return mScreenOn;
42039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
42049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
42056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void initTimes() {
42066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryRealtime = mTrackBatteryPastUptime = 0;
42076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryUptime = mTrackBatteryPastRealtime = 0;
42086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
42096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
42106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
42116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
42126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
42135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4214c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    void initDischarge() {
4215c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mLowDischargeAmountSinceCharge = 0;
4216c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mHighDischargeAmountSinceCharge = 0;
4217c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = 0;
4218c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = 0;
4219c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = 0;
4220c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = 0;
4221c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4222c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
42236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void resetAllStatsLocked() {
42246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mStartCount = 0;
42256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
42269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mScreenOnTimer.reset(this, false);
42276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
42289adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mScreenBrightnessTimer[i].reset(this, false);
42296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mInputEventCounter.reset(false);
42319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneOnTimer.reset(this, false);
42329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mAudioOnTimer.reset(this, false);
42339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mVideoOnTimer.reset(this, false);
42345284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
42359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneSignalStrengthsTimer[i].reset(this, false);
42366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneSignalScanningTimer.reset(this, false);
42386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
42399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneDataConnectionsTimer[i].reset(this, false);
42406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mWifiOnTimer.reset(this, false);
424258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.reset(this, false);
42439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mBluetoothOnTimer.reset(this, false);
42445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<mUidStats.size(); i++) {
42466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUidStats.valueAt(i).reset()) {
42476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUidStats.remove(mUidStats.keyAt(i));
42486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                i--;
42496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
42506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42515a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mKernelWakelockStats.size() > 0) {
42536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            for (SamplingTimer timer : mKernelWakelockStats.values()) {
42546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(timer);
42556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
42566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mKernelWakelockStats.clear();
42576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
42586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4259c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        initDischarge();
42605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
42616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        clearHistoryLocked();
42626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
42635a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
426432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) {
4265c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (oldScreenOn) {
4266c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel;
4267c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4268c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOn += diff;
4269c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOnSinceCharge += diff;
4270c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4271c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4272c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel;
4273c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (diff > 0) {
4274c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOff += diff;
4275c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                mDischargeAmountScreenOffSinceCharge += diff;
4276c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4277c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4278c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        if (newScreenOn) {
4279c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel;
4280c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = 0;
4281c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        } else {
4282c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOnUnplugLevel = 0;
4283c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel;
4284c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4285c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4286c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
42876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void setOnBattery(boolean onBattery, int oldStatus, int level) {
42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
428932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            setOnBatteryLocked(onBattery, oldStatus, level);
429032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
429132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    }
429232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
429332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn    void setOnBatteryLocked(boolean onBattery, int oldStatus, int level) {
429432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        boolean doWrite = false;
429532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE);
429632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        m.arg1 = onBattery ? 1 : 0;
429732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mHandler.sendMessage(m);
429832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        mOnBattery = mOnBatteryInternal = onBattery;
429932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn
430032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long uptime = SystemClock.uptimeMillis() * 1000;
430132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long mSecRealtime = SystemClock.elapsedRealtime();
430232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        long realtime = mSecRealtime * 1000;
430332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (onBattery) {
430432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // We will reset our status if we are unplugging after the
430532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // battery was last full, or the level is at 100, or
430632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // we have gone through a significant charge (from a very low
430732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            // level to a now very high level).
430832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (oldStatus == BatteryManager.BATTERY_STATUS_FULL
430932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || level >= 90
431032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    || (mDischargeCurrentLevel < 20 && level >= 80)) {
431132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                doWrite = true;
431232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                resetAllStatsLocked();
431332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeStartLevel = level;
431432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
431532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
431632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
431732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
431832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: "
431932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
432032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
432132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryUptimeStart = uptime;
432232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryRealtimeStart = realtime;
432332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
432432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
432532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = mDischargeUnplugLevel = level;
432632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mScreenOn) {
432732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = level;
432832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = 0;
43296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
433032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOnUnplugLevel = 0;
433132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeScreenOffUnplugLevel = level;
43326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
433332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOn = 0;
433432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeAmountScreenOff = 0;
433532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
433632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        } else {
433732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateKernelWakelocksLocked();
433832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
433932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
434032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: "
434132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
434232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            addHistoryRecordLocked(mSecRealtime);
434332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
434432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
434532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            mDischargeCurrentLevel = level;
434632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (level < mDischargeUnplugLevel) {
434732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;
434832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level;
434932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            }
435032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn);
435132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
435232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        }
435332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) {
435432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (mFile != null) {
435532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                writeAsyncLocked();
43569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43595a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
43606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // This should probably be exposed in the API, though it's not critical
43616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    private static final int BATTERY_PLUGGED_NONE = 0;
43625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
43636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void setBatteryState(int status, int health, int plugType, int level,
43646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int temp, int volt) {
436532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn        synchronized(this) {
436632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
436732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            int oldStatus = mHistoryCur.batteryStatus;
436832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!mHaveBatteryLevel) {
436932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHaveBatteryLevel = true;
437032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We start out assuming that the device is plugged in (not
437132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // on battery).  If our first report is now that we are indeed
437232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // plugged in, then twiddle our state to correctly reflect that
437332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // since we won't be going through the full setOnBattery().
437432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (onBattery == mOnBattery) {
437532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    if (onBattery) {
437632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
437732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    } else {
437832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
437932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    }
43806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
438132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                oldStatus = status;
43826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
438332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery) {
438432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mDischargeCurrentLevel = level;
438532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = true;
43866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
438732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (onBattery != mOnBattery) {
438832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mHistoryCur.batteryLevel = (byte)level;
43896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryStatus = (byte)status;
43906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryHealth = (byte)health;
43916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryPlugType = (byte)plugType;
43926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryTemperature = (char)temp;
43936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryVoltage = (char)volt;
439432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                setOnBatteryLocked(onBattery, oldStatus, level);
439532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            } else {
439632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                boolean changed = false;
439732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryLevel != level) {
439832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryLevel = (byte)level;
439932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
440032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
440132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryStatus != status) {
440232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryStatus = (byte)status;
440332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
440432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
440532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryHealth != health) {
440632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryHealth = (byte)health;
440732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
440832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
440932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (mHistoryCur.batteryPlugType != plugType) {
441032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryPlugType = (byte)plugType;
441132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
441232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
441332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (temp >= (mHistoryCur.batteryTemperature+10)
441432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || temp <= (mHistoryCur.batteryTemperature-10)) {
441532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryTemperature = (char)temp;
441632de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
441732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
441832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (volt > (mHistoryCur.batteryVoltage+20)
441932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                        || volt < (mHistoryCur.batteryVoltage-20)) {
442032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    mHistoryCur.batteryVoltage = (char)volt;
442132de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    changed = true;
442232de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
442332de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                if (changed) {
442432de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                    addHistoryRecordLocked(SystemClock.elapsedRealtime());
442532de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                }
44266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
442732de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn            if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
442832de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // We don't record history while we are plugged in and fully charged.
442932de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                // The next time we are unplugged, history will be cleared.
443032de2f67ea8276086ae91cbda1d0ef06caf4b3cbDianne Hackborn                mRecordingHistory = false;
44316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
44326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
4433633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
44345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4435c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
4436c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
44375a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4438d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        if (m == null) {
4439d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            // Not crashing might make board bringup easier.
44401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "Couldn't get kernel wake lock stats");
4441d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            return;
4442d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        }
4443d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen
4444c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
4445c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
4446c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
44475a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4448c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
4449c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
44505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
4451c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
4452c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
4453c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4454c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
4455c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
4456c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
4457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
44585a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4459c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
4460c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
4461c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
4462c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
4463c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
4464c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
4465c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
4466c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4467c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4468c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart);
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
44846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
44926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart);
44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
44956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
45029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
45049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
45059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
45096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
45186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
45209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
45229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
45246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
45319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
45329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long getTcpBytes(long current, long[] dataBytes, int which) {
45613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (which == STATS_LAST) {
45623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return dataBytes[STATS_LAST];
45633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
45646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (which == STATS_SINCE_UNPLUGGED) {
45656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) {
45663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return dataBytes[STATS_LAST];
45673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                } else {
45686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return current - dataBytes[STATS_SINCE_UNPLUGGED];
45693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                }
45706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else if (which == STATS_SINCE_CHARGED) {
45716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED];
45723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            }
45733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return current - dataBytes[STATS_CURRENT];
45743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
45753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45763718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesSent(int which) {
45791059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long mobileTxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).txBytes;
45801059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(mobileTxBytes, mMobileDataTx, which);
45813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesReceived(int which) {
45851059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long mobileRxBytes = getNetworkStatsSummary().getTotal(null, mMobileIfaces).rxBytes;
45861059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(mobileRxBytes, mMobileDataRx, which);
45873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45883718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45893718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45903718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesSent(int which) {
45911059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long totalTxBytes = getNetworkStatsSummary().getTotal(null).txBytes;
45921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(totalTxBytes, mTotalDataTx, which);
45933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
45943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
45953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
45963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesReceived(int which) {
45971059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        final long totalRxBytes = getNetworkStatsSummary().getTotal(null).rxBytes;
45981059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        return getTcpBytes(totalRxBytes, mTotalDataRx, which);
45993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
46003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
4601105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4602633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
4603105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4604633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
4605105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46075a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4608633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
46096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mDischargeUnplugLevel;
4610105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46115a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4612105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4613633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
4614105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4615633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
4616105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4617105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46185a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4619633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
4620e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        return mDischargeCurrentLevel;
4621105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
46229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4623e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    @Override
46243bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getLowDischargeAmountSinceCharge() {
46253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4626e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mLowDischargeAmountSinceCharge;
4627e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4628e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel-1;
4629e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4630e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
46313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
46323bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
46333bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
46343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
46353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getHighDischargeAmountSinceCharge() {
46363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
4637e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int val = mHighDischargeAmountSinceCharge;
4638e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
4639e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                val += mDischargeUnplugLevel-mDischargeCurrentLevel;
4640e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
4641e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            return val;
46423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
46433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
4644c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4645c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOn() {
4646c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4647c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOn;
4648c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4649c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4650c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4651c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4652c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4653c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4654c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4655c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4656c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOnSinceCharge() {
4657c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4658c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOnSinceCharge;
4659c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && mScreenOn
4660c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
4661c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
4662c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4663c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4664c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4665c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4666c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4667c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOff() {
4668c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4669c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOff;
4670c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4671c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4672c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4673c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4674c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4675c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4676c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
4677c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn
4678c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    public int getDischargeAmountScreenOffSinceCharge() {
4679c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        synchronized(this) {
4680c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            int val = mDischargeAmountScreenOffSinceCharge;
4681c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            if (mOnBattery && !mScreenOn
4682c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                    && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
4683c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn                val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
4684c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            }
4685c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn            return val;
4686c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        }
4687c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn    }
46883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
46893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
4690e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public int getCpuSpeedSteps() {
4691e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return sNumSpeedSteps;
4692e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4693e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
47009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
47089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
47119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
471232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
472332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * Retrieve the statistics object for a particular process, given
472432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * the name of the process.
472532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @param name process name
472632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @return the statistics object for the process
472732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     */
4728819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public Uid.Proc getProcessStatsLocked(String name, int pid) {
472932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        int uid;
473032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (mUidCache.containsKey(name)) {
473132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            uid = mUidCache.get(name);
473232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        } else {
4733819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani            uid = Process.getUidForPid(pid);
473432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            mUidCache.put(name, uid);
473532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
473632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        Uid u = getUidStatsLocked(uid);
473732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        return u.getProcessStatsLocked(name);
473832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
473932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
474032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    /**
47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
47559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
47569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
475858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    /**
475958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * Massage data to distribute any reasonable work down to more specific
476058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * owners.  Must only be called on a dead BatteryStats object!
476158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     */
476258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void distributeWorkLocked(int which) {
476358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        // Aggregate all CPU time associated with WIFI.
476458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        Uid wifiUid = mUidStats.get(Process.WIFI_UID);
476558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (wifiUid != null) {
476658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which);
476758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (Uid.Proc proc : wifiUid.mProcessStats.values()) {
476858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which);
476958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<mUidStats.size(); i++) {
477058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    Uid uid = mUidStats.valueAt(i);
477158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (uid.mUid != Process.WIFI_UID) {
477258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        long uidRunningTime = uid.getWifiRunningTime(uSecTime, which);
477358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (uidRunningTime > 0) {
477458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*");
477558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            long time = proc.getUserTime(which);
477658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
477758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mUserTime += time;
477858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mUserTime -= time;
477958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getSystemTime(which);
478058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
478158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mSystemTime += time;
478258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mSystemTime -= time;
478358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getForegroundTime(which);
478458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
478558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mForegroundTime += time;
478658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mForegroundTime -= time;
478758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            for (int sb=0; sb<proc.mSpeedBins.length; sb++) {
478858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                SamplingCounter sc = proc.mSpeedBins[sb];
478958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                if (sc != null) {
479058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = sc.getCountLocked(which);
479158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = (time*uidRunningTime)/totalRunningTime;
479258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    SamplingCounter uidSc = uidProc.mSpeedBins[sb];
479358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    if (uidSc == null) {
479458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidSc = new SamplingCounter(mUnpluggables);
479558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidProc.mSpeedBins[sb] = uidSc;
479658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    }
479758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    uidSc.mCount.addAndGet((int)time);
479858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    sc.mCount.addAndGet((int)-time);
479958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                }
480058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            }
480158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            totalRunningTime -= uidRunningTime;
480258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
480358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
480458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
480558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
480658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
480758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
480858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
48096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void shutdownLocked() {
4810ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSyncLocked();
48116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mShuttingDown = true;
48121afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    }
48135a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4814ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    Parcel mPendingWrite = null;
4815ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    final ReentrantLock mWriteLock = new ReentrantLock();
4816ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4817ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeAsyncLocked() {
4818ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(false);
4819ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4820ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4821ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeSyncLocked() {
4822ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(true);
4823ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4824ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4825ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    void writeLocked(boolean sync) {
48261afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
48271afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "writeLocked: no file associated with this instance");
48289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
48299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mShuttingDown) {
48326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
48336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
48345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4835ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        Parcel out = Parcel.obtain();
4836ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSummaryToParcel(out);
4837ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mLastWriteTime = SystemClock.elapsedRealtime();
4838ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4839ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mPendingWrite != null) {
4840ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite.recycle();
4841ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4842ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mPendingWrite = out;
4843ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4844ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (sync) {
4845ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            commitPendingDataToDisk();
4846ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } else {
4847ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            Thread thr = new Thread("BatteryStats-Write") {
4848ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                @Override
4849ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                public void run() {
4850ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4851ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    commitPendingDataToDisk();
4852ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                }
4853ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            };
4854ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            thr.start();
4855ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4856ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4857ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4858ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void commitPendingDataToDisk() {
4859f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        final Parcel next;
4860ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        synchronized (this) {
4861ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next = mPendingWrite;
4862ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite = null;
4863f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            if (next == null) {
4864f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                return;
4865f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            }
4866ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4867ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.lock();
4868ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4869ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
48709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
48711afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite());
4872ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            stream.write(next.marshall());
48739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
48748bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn            FileUtils.sync(stream);
48759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
48761afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            mFile.commit();
48779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
48781afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "Error writing battery statistics", e);
4879ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mFile.rollback();
4880ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } finally {
4881ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next.recycle();
4882ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.unlock();
48839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
48879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
48889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
48899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
48909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
48919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
48929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
48939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
48949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
48959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
48969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
48979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
48989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
48999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
49009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
49019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
49029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
49039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
49049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
49059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
49101afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
49111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readLocked: no file associated with this instance");
49129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
49139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
49169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
49181afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            File file = mFile.chooseForRead();
49191afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (!file.exists()) {
49201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileInputStream stream = new FileInputStream(file);
49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
49259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
49289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
49299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
49319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
49321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.e("BatteryStats", "Error reading battery statistics", e);
49339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49345a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long now = SystemClock.elapsedRealtime();
4936e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (USE_OLD_HISTORY) {
4937e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            addHistoryRecordLocked(now, HistoryItem.CMD_START);
4938e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
49390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        addHistoryBufferLocked(now, HistoryItem.CMD_START);
49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
49439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4946ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    void readHistory(Parcel in, boolean andOldHistory) {
4947ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        final long historyBaseTime = in.readLong();
49480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
49490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataSize(0);
49500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistoryBuffer.setDataPosition(0);
49510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
49520ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int bufSize = in.readInt();
49530ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        int curPos = in.dataPosition();
49540ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) {
49550ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer too large " + bufSize);
49560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else if ((bufSize&~3) != bufSize) {
49570ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            Slog.w(TAG, "File corrupt: history data buffer not aligned " + bufSize);
49580ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        } else {
49590ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            if (DEBUG_HISTORY) Slog.i(TAG, "***************** READING NEW HISTORY: " + bufSize
49600ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    + " bytes at " + curPos);
49610ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            mHistoryBuffer.appendFrom(in, curPos, bufSize);
49620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            in.setDataPosition(curPos + bufSize);
496332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
49645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
4965ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (andOldHistory) {
4966ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            readOldHistory(in);
4967ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
4968ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
4969ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
4970ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
4971ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** OLD mHistoryBaseTime: ");
4972ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
4973ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
4974ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
4975ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        mHistoryBaseTime = historyBaseTime;
4976ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
4977ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
4978ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** NEW mHistoryBaseTime: ");
4979ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
4980ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
4981ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
4982ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
4983ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        // We are just arbitrarily going to insert 1 minute from the sample of
4984ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        // the last run until samples in this run.
4985ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (mHistoryBaseTime > 0) {
4986ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            long oldnow = SystemClock.elapsedRealtime();
4987ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            mHistoryBaseTime = (mHistoryBaseTime - oldnow) + 60*1000;
4988ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            if (DEBUG_HISTORY) {
4989ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                StringBuilder sb = new StringBuilder(128);
4990ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                sb.append("****************** ADJUSTED mHistoryBaseTime: ");
4991ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                TimeUtils.formatDuration(mHistoryBaseTime, sb);
4992ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                Slog.i(TAG, sb.toString());
4993ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            }
49941e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn        }
499532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
49965a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
49970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void readOldHistory(Parcel in) {
4998e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
4999e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
5000e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
50010ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        mHistory = mHistoryEnd = mHistoryCache = null;
50020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        long time;
50035e3357fcee2a23a08434873a89e8ada4c6e6d893Conley Owens        while (in.dataAvail() > 0 && (time=in.readLong()) >= 0) {
50040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            HistoryItem rec = new HistoryItem(time, in);
50050ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            addHistoryRecordLocked(rec);
50060ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
50070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
50080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
5009ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    void writeHistory(Parcel out, boolean andOldHistory) {
5010ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (DEBUG_HISTORY) {
5011ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            StringBuilder sb = new StringBuilder(128);
5012ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append("****************** WRITING mHistoryBaseTime: ");
5013ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mHistoryBaseTime, sb);
5014ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            sb.append(" mLastHistoryTime: ");
5015ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            TimeUtils.formatDuration(mLastHistoryTime, sb);
5016ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            Slog.i(TAG, sb.toString());
5017ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
5018ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        out.writeLong(mHistoryBaseTime + mLastHistoryTime);
50190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.writeInt(mHistoryBuffer.dataSize());
50200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: "
50210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition());
50220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize());
5023ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
5024ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        if (andOldHistory) {
5025ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn            writeOldHistory(out);
5026ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        }
50270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
50280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
50290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    void writeOldHistory(Parcel out) {
5030e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        if (!USE_OLD_HISTORY) {
5031e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn            return;
5032e8c88e6f764a77d94b0051ea169a82a61fcc0d0eDianne Hackborn        }
50336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistory;
503432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        while (rec != null) {
503532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (rec.time >= 0) rec.writeToParcel(out, 0);
503632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            rec = rec.next;
503732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
503832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        out.writeLong(-1);
503932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
50405a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
50429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
50439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
50441afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readFromParcel: version got " + version
50459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
50469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
50479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5049ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        readHistory(in, true);
50505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
50529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
50539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
50549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
50559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
50566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5057633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
50583bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
50593bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
5060c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
5061c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
50625a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
50645a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
50659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
50669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
5067617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5068617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
5069617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5070617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
50719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
50729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
50735284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5074627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
5075627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5076f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in);
5077627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5078627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
5079627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5080105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
5081105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
508258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
508358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in);
5084105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
5085105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
50869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5087c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
50881afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NKW > 10000) {
50891afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW);
50901afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
50911afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
5092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5093c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5094c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
5095c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
5096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5098e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5099e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5100e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
51021afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NU > 10000) {
51031afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many uids " + NU);
51041afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
51051afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
51079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
51089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
51099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
511158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            u.mWifiRunning = false;
51126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
511358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.readSummaryFromParcelLocked(in);
51146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
51166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
51186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5119105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
51206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
51226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastEnabled = false;
51246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
51266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mAudioTurnedOn = false;
51286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in);
51306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mVideoTurnedOn = false;
51326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
51336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in);
51346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
51355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
5136617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
5137617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
5138617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
5139617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5140617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5141617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
5142617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5143617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
51445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
51459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
51467b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NW > 100) {
51471afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many wake locks " + NW);
51481afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
51491afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
51509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
51519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
51529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
51549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
51579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
51609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
51647b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
51651afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many sensors " + NP);
51661afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
51671afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
51689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
51699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
51709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
51719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
51729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
51739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
51749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
51777b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn            if (NP > 1000) {
51781afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many processes " + NP);
51791afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
51801afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
51819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
51829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
51839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
51849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
51869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
518758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                int NSB = in.readInt();
51887b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NSB > 100) {
51897b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many speed bins " + NSB);
51907b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
51917b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
519258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                p.mSpeedBins = new SamplingCounter[NSB];
519358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<NSB; i++) {
519458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (in.readInt() != 0) {
519558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i] = new SamplingCounter(mUnpluggables);
519658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i].readSummaryFromParcelLocked(in);
519758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
519858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
51997b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (!p.readExcessivePowerFromParcelLocked(in)) {
52007b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
52017b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
52029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
52051afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
52061afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many packages " + NP);
52071afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
52081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
52099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
52109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
52119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
52129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
52139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
52147b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                if (NS > 1000) {
52157b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    Slog.w(TAG, "File corrupt: too many services " + NS);
52167b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                    return;
52177b9c56fe0fb99207218827a569eb12fd24901193Dianne Hackborn                }
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
52209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
52219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
52229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
52239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
52249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
52259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
52289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
52299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
52390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
52400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
52410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5249ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        writeHistory(out, true);
52505a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
52526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED));
52536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
52546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED));
52556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
52566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5257633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
5258e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getLowDischargeAmountSinceCharge());
5259e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        out.writeInt(getHighDischargeAmountSinceCharge());
5260c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOnSinceCharge());
5261c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(getDischargeAmountScreenOffSinceCharge());
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5267617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52695284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5270627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5271627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5272f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5273627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5274627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
5275627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5276105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
527758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
5278105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5280c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
5281c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
5282c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
5283c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
5284c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
5285c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
5286c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
5287c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
5288c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
5289c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5290c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
52915a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5292e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
52939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
52949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
52959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
52969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
52979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
52985a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
529958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (u.mWifiRunningTimer != null) {
53006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
530158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mFullWifiLockTimer != null) {
53066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mScanWifiLockTimer != null) {
53126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mWifiMulticastTimer != null) {
53186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mAudioTurnedOnTimer != null) {
53246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mVideoTurnedOnTimer != null) {
53306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
53316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
53336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
53346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
53359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5336617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
5337617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
5338617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
5339617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
5340617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
5341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
5342617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
5343617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
53445a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
53479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
53499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
53519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
53529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
53539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
53559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
53599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
53619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
53659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
53679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
53719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
53749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
53759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
53769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
53799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
53849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
53909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
53919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
53929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
53939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
53949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
53959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
53969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
53989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
539958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    final int N = ps.mSpeedBins.length;
540058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    out.writeInt(N);
540158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    for (int i=0; i<N; i++) {
540258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (ps.mSpeedBins[i] != null) {
540358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(1);
540458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            ps.mSpeedBins[i].writeSummaryFromParcelLocked(out);
540558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        } else {
540658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(0);
540758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
540858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
5409287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ps.writeExcessivePowerToParcelLocked(out);
54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
54209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
54219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
54229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
54239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
54329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
54339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
54349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
54359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54365a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED));
54386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED));
54399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
54439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
54449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54455a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
54479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
54489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
54499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
54509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5452ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        readHistory(in, false);
54535a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
54549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
54559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
54563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastUptime = 0;
54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
54583bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastRealtime = 0;
54599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
54600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in);
5461617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
54620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i,
54630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5464617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5465617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
54669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
54670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
54685284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
54690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i,
54700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5471627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
54720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in);
5473627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
54740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i,
54750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5476627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5477105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
54780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
547958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
548058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
5481105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
54820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
54839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
54849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
54853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastUptime = 0;
54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
54883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastRealtime = 0;
54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
54959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
54969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
54976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5498633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
54993bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
55003bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
5501c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOn = in.readInt();
5502c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOnSinceCharge = in.readInt();
5503c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOff = in.readInt();
5504c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        mDischargeAmountScreenOffSinceCharge = in.readInt();
55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
55069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_LAST] = in.readLong();
55086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1;
55093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_LAST] = in.readLong();
55106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1;
55113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_LAST] = in.readLong();
55126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1;
55133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_LAST] = in.readLong();
55146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1;
55153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = in.readLong();
55173718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
55183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
55193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = in.readInt();
55203f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
55213f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
5522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
5523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
5524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
5527244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel
5528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
5529c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
5530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5531c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
55325a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
55349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
55359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
553658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiRunningTimers.clear();
553758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mFullWifiLockTimers.clear();
553858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mScanWifiLockTimers.clear();
553958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiMulticastTimers.clear();
55409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5541e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5542e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
55439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
55449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
55459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
55469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
55479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
55489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
55499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
55509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
55543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, true, flags);
55553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
55563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
55573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public void writeToParcelWithoutUids(Parcel out, int flags) {
55583bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, false, flags);
55599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55605a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55615a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh    @SuppressWarnings("unused")
55623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void writeToParcelLocked(Parcel out, boolean inclUids, int flags) {
55630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to update with current kernel wake lock counts.
55640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
55650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
55669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
55679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
55689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
55699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
55705a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
55725a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
5573ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        writeHistory(out, false);
55745a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
55759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
55769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
55779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
55789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
5579617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5580617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
5581617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5582617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
55839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
55845284090631e638b916d9a453212e9dc802656a67Wink Saville        for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
5585627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
5586627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5587f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime);
5588627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5589627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
5590627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5591105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
559258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime);
5593105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
55959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
55969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
55979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
55989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
55999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
56009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
56019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
56029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
56039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
56049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
56056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5606633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
56073bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mLowDischargeAmountSinceCharge);
56083bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mHighDischargeAmountSinceCharge);
5609c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOn);
5610c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOnSinceCharge);
5611c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOff);
5612c1b40e361c6cd3bdc53499f17ac09f45e6873059Dianne Hackborn        out.writeInt(mDischargeAmountScreenOffSinceCharge);
56139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
56149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED));
56166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED));
56176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED));
56186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED));
56193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
56203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Write radio uptime for data
56213f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeLong(getRadioDataUptime());
56223f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
56233f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeInt(getBluetoothPingCount());
56243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
56253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
56263bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(mKernelWakelockStats.size());
56273bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
56283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                SamplingTimer kwlt = ent.getValue();
56293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (kwlt != null) {
56303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(1);
56313bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeString(ent.getKey());
56323bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
56333bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                } else {
56343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(0);
56353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                }
5636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
56373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
56383bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
5639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5640e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5641e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
5642e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
56433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
56443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            int size = mUidStats.size();
56453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(size);
56463bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (int i = 0; i < size; i++) {
56473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                out.writeInt(mUidStats.keyAt(i));
56483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                Uid uid = mUidStats.valueAt(i);
56499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56503bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                uid.writeToParcelLocked(out, batteryRealtime);
56513bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
56523bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
56533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
56549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
56589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
56599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
56609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
56619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
56649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
56659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
56675a1e4cf83f5be1b5d79e2643fa791aa269b6a4bcJaikumar Ganesh
56680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    public void prepareForDumpLocked() {
56690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        // Need to retrieve current kernel wake lock stats before printing.
56700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        updateKernelWakelocksLocked();
56710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn    }
56720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn
56731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
56749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
56751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
56761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
56771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
5678617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
56791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
56801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
5681617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
56821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
56831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
56841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
56851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
56865284090631e638b916d9a453212e9dc802656a67Wink Saville            for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
56871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
56881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
5689627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
5690f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            pr.println("*** Signal scanning :");
5691f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.logState(pr, "  ");
5692627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
56931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
56941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
56951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
56961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
56971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
56981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
569958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.logState(pr, "  ");
57001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
57011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
57021059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            pr.println("*** Mobile ifaces:");
57031059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            pr.println(mMobileIfaces.toString());
57049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
57059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
57069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57071059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57081059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats mNetworkSummaryCache;
57091059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats mNetworkDetailCache;
57101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats getNetworkStatsSummary() {
57121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // NOTE: calls from BatteryStatsService already hold this lock
57131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (this) {
57141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (mNetworkSummaryCache == null
57151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    || mNetworkSummaryCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) {
57161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                try {
57171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkSummaryCache = mNetworkStatsFactory.readNetworkStatsSummary();
57181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                } catch (IllegalStateException e) {
57191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    // log problem and return empty object
57201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    Log.wtf(TAG, "problem reading network stats", e);
57211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkSummaryCache = new NetworkStats(SystemClock.elapsedRealtime(), 0);
57221059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
57231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
57241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            return mNetworkSummaryCache;
57251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
57261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
57271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
57281059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    private NetworkStats getNetworkStatsDetailGroupedByUid() {
57291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        // NOTE: calls from BatteryStatsService already hold this lock
57301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (this) {
57311059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            if (mNetworkDetailCache == null
57321059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    || mNetworkDetailCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) {
57331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                try {
57341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkDetailCache = mNetworkStatsFactory
57351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                            .readNetworkStatsDetail().groupedByUid();
57361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                } catch (IllegalStateException e) {
57371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    // log problem and return empty object
57381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    Log.wtf(TAG, "problem reading network stats", e);
57391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                    mNetworkDetailCache = new NetworkStats(SystemClock.elapsedRealtime(), 0);
57401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey                }
57411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            }
57421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            return mNetworkDetailCache;
57431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
57441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
57459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5746