BatteryStatsImpl.java revision 8bdf5935c0db4a66ab33a10b43398d2523cfa15d
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
191afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport com.android.internal.util.JournaledFile;
201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn
213f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset;
221719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriffimport android.net.TrafficStats;
236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackbornimport android.os.BatteryManager;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
258bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackbornimport android.os.FileUtils;
260d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Handler;
270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackbornimport android.os.Message;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
31c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
34f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState;
35e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
36627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
401afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport android.util.Slog;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
52c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
544cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger;
55ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackbornimport java.util.concurrent.locks.ReentrantLock;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
6532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    private static final boolean DEBUG_HISTORY = false;
6632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
71287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    private static final int VERSION = 52;
72e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // Maximum number of items we will record in the history.
747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_HISTORY_ITEMS = 2000;
756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
76f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    // No, really, THIS is the maximum number of items we will record in the history.
77f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    private static final int MAX_MAX_HISTORY_ITEMS = 3000;
78f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
799e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // The maximum number of names wakelocks we will keep track of
809e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // per uid; once the limit is reached, we batch the remaining wakelocks
819e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // in to one common name.
827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    private static final int MAX_WAKELOCKS_PER_UID = 30;
839e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn
849e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    private static final String BATCHED_WAKELOCK_NAME = "*overflow*";
859e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn
86e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private static int sNumSpeedSteps;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
881afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    private final JournaledFile mFile;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_UPDATE_WAKELOCKS = 1;
910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    static final int MSG_REPORT_POWER_CHANGE = 2;
92287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    static final long DELAY_UPDATE_WAKELOCKS = 5*1000;
930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public interface BatteryCallback {
950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryNeedsCpuUpdate();
960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void batteryPowerChanged(boolean onBattery);
970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final class MyHandler extends Handler {
1000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        @Override
1010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        public void handleMessage(Message msg) {
1020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            BatteryCallback cb = mCallback;
1030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            switch (msg.what) {
1040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_UPDATE_WAKELOCKS:
1050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryNeedsCpuUpdate();
1070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                case MSG_REPORT_POWER_CHANGE:
1100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (cb != null) {
1110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        cb.batteryPowerChanged(msg.arg1 != 0);
1120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
1130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    break;
1140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
1150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
1160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
1170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private final MyHandler mHandler;
1190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    private BatteryCallback mCallback;
1210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>();
133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>();
134c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>();
135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers
136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            = new SparseArray<ArrayList<StopwatchTimer>>();
13758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<StopwatchTimer>();
13858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<StopwatchTimer>();
13958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mScanWifiLockTimers = new ArrayList<StopwatchTimer>();
14058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<StopwatchTimer>();
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    // Last partial timers we use for distributing CPU usage.
1430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<StopwatchTimer>();
1440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mShuttingDown;
1506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
1516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    long mHistoryBaseTime;
1526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mHaveBatteryLevel = false;
1536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    boolean mRecordingHistory = true;
1546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mNumHistoryItems;
1556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistory;
1566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryEnd;
1579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    HistoryItem mHistoryLastEnd;
1586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    HistoryItem mHistoryCache;
1596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    final HistoryItem mHistoryCur = new HistoryItem();
16032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mScreenOnTimer;
1773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
178617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mScreenBrightnessBin = -1;
179c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
180617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
181617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    Counter mInputEventCounter;
182617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
184c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mPhoneOnTimer;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
186244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mAudioOn;
187244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mAudioOnTimer;
188244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
189244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mVideoOn;
190244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mVideoOnTimer;
191244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
192627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
193c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneSignalStrengthsTimer =
194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS];
195f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
196f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    StopwatchTimer mPhoneSignalScanningTimer;
197f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
198627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneDataConnectionsTimer =
200c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
201627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
202105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiOnTimer;
204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mWifiOnUid = -1;
205d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
20658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    boolean mGlobalWifiRunning;
20758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    StopwatchTimer mGlobalWifiRunningTimer;
208105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
209105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mBluetoothOnTimer;
2113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /** Bluetooth headset object */
2133f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    BluetoothHeadset mBtHeadset;
2143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
2253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
2283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
229105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
230105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
231105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
232633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeStartLevel;
2336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    int mDischargeUnplugLevel;
234633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeCurrentLevel;
2353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mLowDischargeAmountSinceCharge;
2363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    int mHighDischargeAmountSinceCharge;
237244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
239244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    // Mobile data transferred while on battery
2413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataTx = new long[4];
2423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataRx = new long[4];
2433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataTx = new long[4];
2443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataRx = new long[4];
2453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataUptime;
2473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataStart;
2483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingCount;
2503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingStart = -1;
2513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
252f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private int mPhoneServiceState = -1;
253f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
254c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
255c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
256c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
257c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final HashMap<String, SamplingTimer> mKernelWakelockStats =
258c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, SamplingTimer>();
259c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
260c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public Map<String, ? extends SamplingTimer> getKernelWakelockStats() {
261c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mKernelWakelockStats;
262c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
263c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
264c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static int sKernelWakelockUpdateVersion = 0;
265c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
266c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int[] PROC_WAKELOCKS_FORMAT = new int[] {
267c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
268c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 1: count
269c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
270c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
271c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
272c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 5: totalTime
273c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    };
274c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
275c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final String[] mProcWakelocksName = new String[3];
276c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final long[] mProcWakelocksData = new long[3];
277c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
278c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
279c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added
280c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * to mKernelWakelockStats.
281c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
282c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> mProcWakelockFileStats =
283c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, KernelWakelockStats>();
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>();
28632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
2891afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
2900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
301e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class Counter extends BatteryStats.Counter implements Unpluggable {
3024cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        final AtomicInteger mCount = new AtomicInteger();
3036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
304617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLoadedCount;
305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLastCount;
306617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mUnpluggedCount;
307617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mPluggedCount;
308617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
309617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables, Parcel in) {
3106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
3114cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = in.readInt();
3124cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
313617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLoadedCount = in.readInt();
3143bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
315617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = in.readInt();
316617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
317617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
318617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
319617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables) {
3206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
321617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
322617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
323617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
324617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void writeToParcel(Parcel out) {
3254cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(mCount.get());
326617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLoadedCount);
327617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mUnpluggedCount);
328617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
329617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
330617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void unplug(long batteryUptime, long batteryRealtime) {
3314cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount;
3324cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
333617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
334617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
335617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void plug(long batteryUptime, long batteryRealtime) {
3364cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = mCount.get();
337617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
338617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
339617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
340617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Writes a possibly null Counter to a Parcel.
341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
342617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param out the Parcel to be written to.
343617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param counter a Counter, or null.
344617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
345617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static void writeCounterToParcel(Parcel out, Counter counter) {
346617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (counter == null) {
347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0); // indicates null
348617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return;
349617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(1); // indicates non-null
351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            counter.writeToParcel(out);
353617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
356c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            int val;
358617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (which == STATS_LAST) {
359617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mLastCount;
360617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
3614cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate                val = mCount.get();
3626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mUnpluggedCount;
3646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
365617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mLoadedCount;
366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
367617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return val;
370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void logState(Printer pw, String prefix) {
3734cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            pw.println(prefix + "mCount=" + mCount.get()
374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mUnpluggedCount=" + mUnpluggedCount
376617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mPluggedCount=" + mPluggedCount);
377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
3794cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        void stepAtomic() {
3804cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.incrementAndGet();
381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
3836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
3846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this counter.
3856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
3866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void reset(boolean detachIfReset) {
3876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount.set(0);
3886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
3896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
3906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
3916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
3926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
3936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
3946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
3956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
3966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
3976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void writeSummaryFromParcelLocked(Parcel out) {
3994cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            int count = mCount.get();
4004cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(count);
401617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
402617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
403617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void readSummaryFromParcelLocked(Parcel in) {
4044cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mLoadedCount = in.readInt();
4054cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mLoadedCount);
4063bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
4074cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount = mLoadedCount;
408617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
409617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
410e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
411e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class SamplingCounter extends Counter {
412e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
413e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) {
414e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables, in);
415e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
416e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
417e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables) {
418e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables);
419e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
420e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4214cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        public void addCountAtomic(long count) {
4224cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.addAndGet((int)count);
423e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
424e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
425e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
429c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static abstract class Timer extends BatteryStats.Timer implements Unpluggable {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
4316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        final ArrayList<Unpluggable> mUnpluggables;
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
467244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        /**
468244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * Constructs from a parcel.
469244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param type
470244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param unpluggables
471244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param powerType
472244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param in
473244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         */
474c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) {
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
4766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
4803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
4843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables) {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
4916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables = unpluggables;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
495c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract long computeRunTimeLocked(long curBatteryRealtime);
496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
497c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract int computeCurrentCountLocked();
498c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
4996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
5006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear state of this timer.  Returns true if the timer is inactive
5016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * so can be completely dropped.
5026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
5039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
5046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mTotalTime = mLoadedTime = mLastTime = 0;
5056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCount = mLoadedCount = mLastCount = 0;
5066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (detachIfReset) {
5076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                detach();
5086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
5096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
5106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
5126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
5136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mUnpluggables.remove(this);
5146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " old mTotalTime=" + mTotalTime);
544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = computeRunTimeLocked(batteryRealtime);
546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = computeCurrentCountLocked();
547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType
549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + ": new mTotalTime=" + mTotalTime);
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long getTotalTimeLocked(long batteryRealtime, int which) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
5776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
5796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                val = computeCurrentCountLocked();
5946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
5966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which != STATS_SINCE_CHARGED) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
604627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + " mCount=" + mCount
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
608627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
610627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long runTime = computeRunTimeLocked(batteryRealtime);
617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Divide by 1000 for backwards compatibility
618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong((runTime + 500) / 1000);
619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount);
620c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
623c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Multiply by 1000 for backwards compatibility
624c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = mLoadedTime = in.readLong() * 1000;
6253bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastTime = 0;
626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedTime = mTotalTime;
627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = mLoadedCount = in.readInt();
6283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mLastCount = 0;
629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedCount = mCount;
630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class SamplingTimer extends Timer {
634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported count from /proc/wakelocks.
637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mCurrentReportedCount;
639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported count from /proc/wakelocks when unplug() was last
642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUnpluggedReportedCount;
645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported total_time from /proc/wakelocks.
648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mCurrentReportedTotalTime;
650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported total_time from /proc/wakelocks when unplug() was last
654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUnpluggedReportedTotalTime;
657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently in a discharge cycle.
660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mInDischarge;
662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently recording reported values.
665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mTrackingReportedValues;
667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /*
669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * A sequnce counter, incremented once for each update of the stats.
670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUpdateVersion;
672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) {
674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables, in);
675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = in.readInt();
676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = in.readInt();
677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = in.readLong();
678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = in.readLong();
679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge,
684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                boolean trackReportedValues) {
685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables);
686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = trackReportedValues;
687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setStale() {
691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = false;
692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = 0;
693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = 0;
694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setUpdateVersion(int version) {
697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateVersion = version;
698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getUpdateVersion() {
701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUpdateVersion;
702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedCount(int count) {
705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedCount == 0) {
706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = count;
708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
710c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
711c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = count;
712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedTotalTime(long totalTime) {
715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedTotalTime == 0) {
716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = totalTime;
718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = totalTime;
722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
723c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
724c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void unplug(long batteryUptime, long batteryRealtime) {
725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.unplug(batteryUptime, batteryRealtime);
726c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mTrackingReportedValues) {
727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = mCurrentReportedCount;
729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = true;
731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.plug(batteryUptime, batteryRealtime);
735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = false;
736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mTotalTime + (mInDischarge && mTrackingReportedValues
748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
749c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
750c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
751c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
752c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount + (mInDischarge && mTrackingReportedValues
753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
759c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mUnpluggedReportedCount);
760c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUnpluggedReportedTotalTime);
762c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
763c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
764c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
7659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
7669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, detachIfReset);
7676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            setStale();
7686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return true;
7696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
7706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeSummaryFromParcelLocked(out, batteryRealtime);
773c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
775c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /**
787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * State for keeping track of timing information.
788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class StopwatchTimer extends Timer {
7900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final Uid mUid;
791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        final ArrayList<StopwatchTimer> mTimerPool;
7920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
793c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mNesting;
794c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The last time at which we updated the timer.  If mNesting is > 0,
797c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * subtract this from the current battery time to find the amount of
798c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * time we have been running since we last computed an update.
799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUpdateTime;
801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
8039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The total time at which the timer was acquired, to determine if it
804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * was actually held for an interesting duration.
805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mAcquireTime;
807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
808f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        long mTimeout;
809f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
8100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        /**
8110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * For partial wake locks, keep track of whether we are in the list
8120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         * to consume CPU cycles.
8130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn         */
8140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean mInList;
8150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
8160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables, Parcel in) {
818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables, in);
8190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateTime = in.readLong();
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
8240d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables) {
826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables);
8270d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mUid = uid;
828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
831f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        void setTimeout(long timeout) {
832f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mTimeout = timeout;
833f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
834f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUpdateTime);
838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mNesting > 0) {
842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                super.plug(batteryUptime, batteryRealtime);
846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUpdateTime = batteryRealtime;
847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        boolean isRunningLocked() {
88232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            return mNesting > 0;
88332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
88432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long realtime = SystemClock.elapsedRealtime() * 1000;
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
922c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final ArrayList<StopwatchTimer> pool) {
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long realtime = SystemClock.elapsedRealtime() * 1000;
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
927c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final StopwatchTimer t = pool.get(i);
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
936c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
937c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
938f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) {
939f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                curBatteryRealtime = mUpdateTime + mTimeout;
940f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
947c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
948c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
949c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount;
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        boolean reset(BatteryStatsImpl stats, boolean detachIfReset) {
9536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean canDetach = mNesting <= 0;
9549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            super.reset(stats, canDetach && detachIfReset);
9559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mNesting > 0) {
9569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mUpdateTime = stats.getBatteryRealtimeLocked(
9579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        SystemClock.elapsedRealtime() * 1000);
9589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
9599adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mAcquireTime = mTotalTime;
9606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return canDetach;
9616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
9626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
9636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        void detach() {
9646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            super.detach();
9656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mTimerPool != null) {
9666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mTimerPool.remove(this);
9676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
9686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
9696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
971c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
976c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> readKernelWakelockStats() {
977c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
978c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        byte[] buffer = new byte[4096];
979c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int len;
980c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
981c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        try {
982c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            FileInputStream is = new FileInputStream("/proc/wakelocks");
983c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            len = is.read(buffer);
984c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            is.close();
985c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
986c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (len > 0) {
987c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                int i;
988c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (i=0; i<len; i++) {
989c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (buffer[i] == '\0') {
990c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        len = i;
991c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        break;
992c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
993c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
994c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
995c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.FileNotFoundException e) {
996c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
997c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.IOException e) {
998c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
999c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1000c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1001c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return parseProcWakelocks(buffer, len);
1002c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
1003c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1004c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> parseProcWakelocks(
1005c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            byte[] wlBuffer, int len) {
1006c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        String name;
1007c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int count;
1008c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long totalTime;
1009c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int startIndex, endIndex;
1010c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int numUpdatedWlNames = 0;
1011c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        // Advance past the first line.
1013c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int i;
1014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++);
1015c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        startIndex = endIndex = i + 1;
1016c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1017c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        synchronized(this) {
1018c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Map<String, KernelWakelockStats> m = mProcWakelockFileStats;
1019c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1020c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            sKernelWakelockUpdateVersion++;
1021c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            while (endIndex < len) {
1022c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (endIndex=startIndex;
1023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0';
1024c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex++);
1025e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                // Don't go over the end of the buffer
1026e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                if (endIndex < len) {
1027e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                    endIndex++; // endIndex is an exclusive upper bound.
1028e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                }
1029c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String[] nameStringArray = mProcWakelocksName;
1031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                long[] wlData = mProcWakelocksData;
10322098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // Stomp out any bad characters since this is from a circular buffer
10332098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // A corruption is seen sometimes that results in the vm crashing
10342098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // This should prevent crashes and the line will probably fail to parse
10352098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                for (int j = startIndex; j < endIndex; j++) {
10362098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                    if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?';
10372098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                }
103853b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex,
103953b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                        PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null);
10402098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani
1041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                name = nameStringArray[0];
1042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                count = (int) wlData[1];
1043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // convert nanoseconds to microseconds with rounding.
1044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                totalTime = (wlData[2] + 500) / 1000;
1045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
104653b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                if (parsed && name.length() > 0) {
1047c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (!m.containsKey(name)) {
1048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        m.put(name, new KernelWakelockStats(count, totalTime,
1049c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                sKernelWakelockUpdateVersion));
1050c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        numUpdatedWlNames++;
1051c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    } else {
1052c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        KernelWakelockStats kwlStats = m.get(name);
1053c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        if (kwlStats.mVersion == sKernelWakelockUpdateVersion) {
1054c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount += count;
1055c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime += totalTime;
1056c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        } else {
1057c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount = count;
1058c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime = totalTime;
1059c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mVersion = sKernelWakelockUpdateVersion;
1060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            numUpdatedWlNames++;
1061c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        }
1062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
106353b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                }
1064c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                startIndex = endIndex;
1065c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1066c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1067c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (m.size() != numUpdatedWlNames) {
1068c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Don't report old data.
1069c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Iterator<KernelWakelockStats> itr = m.values().iterator();
1070c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                while (itr.hasNext()) {
1071c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (itr.next().mVersion != sKernelWakelockUpdateVersion) {
1072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        itr.remove();
1073c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
1074c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
1075c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
1076c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return m;
1077c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1078c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
1079c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1080c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private class KernelWakelockStats {
1081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mCount;
1082c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long mTotalTime;
1083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mVersion;
1084c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1085c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        KernelWakelockStats(int count, long totalTime, int version) {
1086c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = count;
1087c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = totalTime;
1088c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mVersion = version;
1089c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1090c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
1091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
1092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
1093c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Get the KernelWakelockTimer associated with name, and create a new one if one
1094c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * doesn't already exist.
1095c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
1096c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public SamplingTimer getKernelWakelockTimerLocked(String name) {
1097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer kwlt = mKernelWakelockStats.get(name);
1098c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kwlt == null) {
1099c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
1100c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    true /* track reported values */);
1101c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mKernelWakelockStats.put(name, kwlt);
1102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
1103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return kwlt;
1104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
11053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataPlug(long[] dataTransfer, long currentBytes) {
11076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_LAST] = dataTransfer[STATS_SINCE_UNPLUGGED];
11086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = -1;
11093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataUnplug(long[] dataTransfer, long currentBytes) {
11126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        dataTransfer[STATS_SINCE_UNPLUGGED] = currentBytes;
11133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11153f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11163f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Radio uptime in microseconds when transferring data. This value is very approximate.
11173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return
11183f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private long getCurrentRadioDataUptime() {
11203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        try {
11213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
11223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (!awakeTimeFile.exists()) return 0;
11233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
11243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            String line = br.readLine();
11253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            br.close();
11263f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return Long.parseLong(line) * 1000;
11273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (NumberFormatException nfe) {
11283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
11293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (IOException ioe) {
11303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
11313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
11323718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return 0;
11333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11363f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
11373f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getRadioDataUptimeMs() {
11393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
11403f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
11413f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
11423f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
11433f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Returns the duration that the cell radio was up for data transfers.
11443f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
11453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptime() {
11463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (mRadioDataStart == -1) {
11473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return mRadioDataUptime;
11483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
11493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentRadioDataUptime() - mRadioDataStart;
11503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
11513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
11523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int getCurrentBluetoothPingCount() {
11543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBtHeadset != null) {
11553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBtHeadset.getBatteryUsageHint();
11563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
11573f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return -1;
11583f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
11593f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
11603f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public int getBluetoothPingCount() {
11613f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBluetoothPingStart == -1) {
11623f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBluetoothPingCount;
11633f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        } else if (mBtHeadset != null) {
11643f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentBluetoothPingCount() - mBluetoothPingStart;
11653f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
116682cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        return 0;
11673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
11683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
11693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public void setBtHeadset(BluetoothHeadset headset) {
117082cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) {
117182cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani            mBluetoothPingStart = getCurrentBluetoothPingCount();
117282cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        }
11733f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBtHeadset = headset;
11743f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
11753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1176f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn    int mChangedStates = 0;
1177f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
11786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime) {
11796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (!mHaveBatteryLevel || !mRecordingHistory) {
11806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
11816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
11829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
11839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        // If the current time is basically the same as the last time,
1184f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // and no states have since the last recorded entry changed and
1185f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // are now resetting back to their original value, then just collapse
1186f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        // into one record.
11879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE
1188f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && (mHistoryBaseTime+curTime) < (mHistoryEnd.time+2000)
1189f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                && ((mHistoryEnd.states^mHistoryCur.states)&mChangedStates) == 0) {
11909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // If the current is the same as the one before, then we no
11919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // longer need the entry.
11929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE
11939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    && mHistoryLastEnd.same(mHistoryCur)) {
11949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd.next = null;
11959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.next = mHistoryCache;
11969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryCache = mHistoryEnd;
11979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd = mHistoryLastEnd;
11989adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryLastEnd = null;
11999adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            } else {
1200f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                mChangedStates |= mHistoryEnd.states^mHistoryCur.states;
12019adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, mHistoryCur);
12029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
12039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return;
12049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
12059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1206f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        mChangedStates = 0;
1207f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn
1208f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        if (mNumHistoryItems == MAX_HISTORY_ITEMS
1209f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) {
12107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            addHistoryRecordLocked(curTime, HistoryItem.CMD_OVERFLOW);
12117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
12127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
12136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mNumHistoryItems >= MAX_HISTORY_ITEMS) {
12146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // Once we've reached the maximum number of items, we only
1215f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // record changes to the battery level and the most interesting states.
1216f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            // Once we've reached the maximum maximum number of items, we only
12176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // record changes to the battery level.
12186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryEnd != null && mHistoryEnd.batteryLevel
1219f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    == mHistoryCur.batteryLevel &&
1220f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                    (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS
1221f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                            || ((mHistoryEnd.states^mHistoryCur.states)
1222f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                                    & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
12236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return;
12246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
12256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
12269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
12276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE);
12286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
12296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
12306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(long curTime, byte cmd) {
12316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistoryCache;
123232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (rec != null) {
123332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCache = rec.next;
123432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
12356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            rec = new HistoryItem();
123632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
12376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur);
12386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
12396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(rec);
124032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
124132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
12426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void addHistoryRecordLocked(HistoryItem rec) {
12436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mNumHistoryItems++;
124432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        rec.next = null;
12459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mHistoryLastEnd = mHistoryEnd;
124632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mHistoryEnd != null) {
124732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd.next = rec;
124832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd = rec;
124932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
125032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistory = mHistoryEnd = rec;
125132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
125232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
125332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
12546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void clearHistoryLocked() {
125532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mHistory != null) {
125632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd.next = mHistoryCache;
125732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCache = mHistory;
12589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistory = mHistoryLastEnd = mHistoryEnd = null;
125932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
12606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mNumHistoryItems = 0;
12616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mHistoryBaseTime = 0;
126232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
126332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
12646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doUnplugLocked(long batteryUptime, long batteryRealtime) {
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
12671719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff            u.mStartedTcpBytesReceived = TrafficStats.getUidRxBytes(u.mUid);
12681719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff            u.mStartedTcpBytesSent = TrafficStats.getUidTxBytes(u.mUid);
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track total mobile data
12761719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mMobileDataRx, TrafficStats.getMobileRxBytes());
12771719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mMobileDataTx, TrafficStats.getMobileTxBytes());
12781719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mTotalDataRx, TrafficStats.getTotalRxBytes());
12791719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mTotalDataTx, TrafficStats.getTotalTxBytes());
12803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
12813f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataStart = getCurrentRadioDataUptime();
12823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = 0;
12833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
12843f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = getCurrentBluetoothPingCount();
12853f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = 0;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
12886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void doPlugLocked(long batteryUptime, long batteryRealtime) {
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13031719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mMobileDataRx, TrafficStats.getMobileRxBytes());
13041719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mMobileDataTx, TrafficStats.getMobileTxBytes());
13051719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mTotalDataRx, TrafficStats.getTotalRxBytes());
13061719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mTotalDataTx, TrafficStats.getTotalTxBytes());
13073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
13083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataUptime = getRadioDataUptime();
13093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
13103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
13113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
13123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = getBluetoothPingCount();
13133f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
13169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mWakeLockNesting;
13179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartWakeLocked(int uid, int pid, String name, int type) {
13191ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
13201ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // Only care about partial wake locks, since full wake locks
13211ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            // will be canceled when the user puts the screen to sleep.
13221ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
13231ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG;
13241ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: "
13251ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
13261ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
13271ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
13281ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting++;
13299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
13309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
13310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
13320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
13330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
13340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
13359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type);
13369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
13379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
13389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopWakeLocked(int uid, int pid, String name, int type) {
13401ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        if (type == WAKE_TYPE_PARTIAL) {
13411ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            mWakeLockNesting--;
13421ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (mWakeLockNesting == 0) {
13431ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG;
13441ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: "
13451ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
13461ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
13471ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            }
13489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
13499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (uid >= 0) {
13500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
13510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
13520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
13530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
13549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type);
13559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
13569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
13579adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
13587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
13597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
13607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
13617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStartWakeLocked(ws.get(i), pid, name, type);
13627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
13637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
13647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
13657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name, int type) {
13667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
13677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
13687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteStopWakeLocked(ws.get(i), pid, name, type);
13697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
13707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
13717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
13720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public int startAddingCpuLocked() {
13730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler.removeMessages(MSG_UPDATE_WAKELOCKS);
13740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
13750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (mScreenOn) {
13760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
13770d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
13780d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
13790d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
13800d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (N == 0) {
13810d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.clear();
13820d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return 0;
13830d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
13840d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
13850d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // How many timers should consume CPU?  Only want to include ones
13860d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        // that have already been in the list.
13870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
13880d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
13890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (st.mInList) {
13900d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = st.mUid;
13910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // We don't include the system UID, because it so often
13920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                // holds wake locks at one request or another of an app.
13930d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null && uid.mUid != Process.SYSTEM_UID) {
13940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    return 50;
13950d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
13960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
13970d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
13980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
13990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        return 0;
14000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
14010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
14020d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void finishAddingCpuLocked(int perc, int utime, int stime, long[] cpuSpeedTimes) {
14030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int N = mPartialTimers.size();
14040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (perc != 0) {
14050d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            int num = 0;
14060d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<N; i++) {
14070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                StopwatchTimer st = mPartialTimers.get(i);
14080d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (st.mInList) {
14090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid uid = st.mUid;
14100d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // We don't include the system UID, because it so often
14110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    // holds wake locks at one request or another of an app.
14120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (uid != null && uid.mUid != Process.SYSTEM_UID) {
14130d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        num++;
14140d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
14150d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
14160d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
14170d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (num != 0) {
14180d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                for (int i=0; i<N; i++) {
14190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    StopwatchTimer st = mPartialTimers.get(i);
14200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    if (st.mInList) {
14210d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        Uid uid = st.mUid;
14220d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        if (uid != null && uid.mUid != Process.SYSTEM_UID) {
1423618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int myUTime = utime/num;
1424618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            int mySTime = stime/num;
1425618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            utime -= myUTime;
1426618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            stime -= mySTime;
1427618b8c1e988ac6c8006da66ca9e8a1e1d49c9dd5Dianne Hackborn                            num--;
14280d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            Uid.Proc proc = uid.getProcessStatsLocked("*wakelock*");
14290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addCpuTimeLocked(myUTime, mySTime);
14300d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                            proc.addSpeedStepTimes(cpuSpeedTimes);
14310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        }
14320d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    }
14330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
14340d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
14350d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
14360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            // Just in case, collect any lost CPU time.
14370d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            if (utime != 0 || stime != 0) {
14380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                Uid uid = getUidStatsLocked(Process.SYSTEM_UID);
14390d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                if (uid != null) {
14400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    Uid.Proc proc = uid.getProcessStatsLocked("*lost*");
14410d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addCpuTimeLocked(utime, stime);
14420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    proc.addSpeedStepTimes(cpuSpeedTimes);
14430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                }
14440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
14450d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
14460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
14470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        final int NL = mLastPartialTimers.size();
14480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        boolean diff = N != NL;
14490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL && !diff; i++) {
14500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            diff |= mPartialTimers.get(i) != mLastPartialTimers.get(i);
14510d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
14520d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        if (!diff) {
14530d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            for (int i=0; i<NL; i++) {
14540d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mPartialTimers.get(i).mInList = true;
14550d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            }
14560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            return;
14570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
14580d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
14590d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<NL; i++) {
14600d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.get(i).mInList = false;
14610d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
14620d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mLastPartialTimers.clear();
14630d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        for (int i=0; i<N; i++) {
14640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            StopwatchTimer st = mPartialTimers.get(i);
14650d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            st.mInList = true;
14660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mLastPartialTimers.add(st);
14670d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        }
14680d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
14690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
14709adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteProcessDiedLocked(int uid, int pid) {
14719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
14729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
14739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.mPids.remove(pid);
14749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
14759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
14769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
14779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public long getProcessWakeTime(int uid, int pid, long realtime) {
14789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
14799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
14809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Uid.Pid p = u.mPids.get(pid);
14819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
14829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return p.mWakeSum + (p.mWakeStart != 0 ? (realtime - p.mWakeStart) : 0);
14839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
14849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
14859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return 0;
14869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
14879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
14889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) {
14899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        Uid u = mUidStats.get(uid);
14909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (u != null) {
14919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            u.reportExcessiveWakeLocked(proc, overTime, usedTime);
14929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
14939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
14949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
1495287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) {
1496287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        Uid u = mUidStats.get(uid);
1497287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        if (u != null) {
1498287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            u.reportExcessiveCpuLocked(proc, overTime, usedTime);
1499287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
1500287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn    }
1501287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
15029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    int mSensorNesting;
15039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStartSensorLocked(int uid, int sensor) {
15059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
15069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG;
15079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: "
15089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
15099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
15109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting++;
15129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStartSensor(sensor);
15139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
15149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public void noteStopSensorLocked(int uid, int sensor) {
15169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mSensorNesting--;
15179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        if (mSensorNesting == 0) {
15189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG;
15199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: "
15209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
15219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
15229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
15239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        getUidStatsLocked(uid).noteStopSensor(sensor);
15249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
15259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
152632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mGpsNesting;
152732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
15286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStartGpsLocked(int uid) {
152932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
15306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG;
153132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: "
153232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
15336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
153432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
153532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting++;
15362e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStartGps();
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void noteStopGpsLocked(int uid) {
154032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting--;
154132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
15426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG;
154332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: "
154432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
15456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
154632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
15472e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStopGps();
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
15526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG;
155332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: "
155432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
15556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
1558617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1559617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this);
1560617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
15619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // Fake a wake lock, so we consider the device waked as long
15639adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            // as the screen is on.
15641ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
15706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG;
157132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: "
157232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
15736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
1576617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1577617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1578617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
15799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
15801ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL);
1581617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1582617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1583617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1584617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightnessLocked(int brightness) {
1585617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Bin the brightness.
1586617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
1587617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (bin < 0) bin = 0;
1588617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
1589617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mScreenBrightnessBin != bin) {
15906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK)
15916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT);
159232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: "
159332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
15946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenOn) {
1596617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (mScreenBrightnessBin >= 0) {
1597617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1598617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1599617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[bin].startRunningLocked(this);
1600617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1601617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessBin = bin;
1602617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1603617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1604617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
16054cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate    public void noteInputEventAtomic() {
16064cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        mInputEventCounter.stepAtomic();
1607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1608617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivityLocked(int uid, int event) {
16102e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteUserActivityLocked(event);
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
16153bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG;
161632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: "
161732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
16263bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG;
162732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: "
162832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
16296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
163432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
16353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void stopAllSignalStrengthTimersLocked(int except) {
16363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) {
16373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (i == except) {
16383bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                continue;
16393bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
16403bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) {
16413bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalStrengthsTimer[i].stopRunningLocked(this);
16423bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
16433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
16443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
16453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1646f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    /**
1647f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * Telephony stack updates the phone state.
1648f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * @param state phone state from ServiceState.getState()
1649f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     */
1650f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneStateLocked(int state) {
16513bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        boolean scanning = false;
16523bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
1653f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        int bin = mPhoneSignalStrengthBin;
16543bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
16553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If the phone is powered off, stop all timers.
16563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (state == ServiceState.STATE_POWER_OFF) {
16573bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            stopAllSignalStrengthTimersLocked(-1);
1658f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1659f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        // If we're back in service or continuing in service, restart the old timer.
16603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } if (state == ServiceState.STATE_IN_SERVICE) {
1661f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (bin == -1) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1662f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) {
1663f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1664f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
16653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
16663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // If we're out of service, we are in the lowest signal strength
16673bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        // bin and have the scanning bit set.
1668f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        } else if (state == ServiceState.STATE_OUT_OF_SERVICE) {
16693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            scanning = true;
1670f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalStrengthBin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
16713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            stopAllSignalStrengthTimersLocked(mPhoneSignalStrengthBin);
1672f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].isRunningLocked()) {
1673f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].startRunningLocked(this);
1674f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1675f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalScanningTimer.isRunningLocked()) {
16766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG;
16776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: "
16786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
16796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
1680f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalScanningTimer.startRunningLocked(this);
1681f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1682f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
168332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
16843bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (!scanning) {
16853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            // If we are no longer scanning, then stop the scanning timer.
16863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            if (mPhoneSignalScanningTimer.isRunningLocked()) {
16873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG;
16883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: "
16893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
16903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
16913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mPhoneSignalScanningTimer.stopRunningLocked(this);
16923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
16933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
16943bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
169532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mPhoneServiceState != state) {
16966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK)
16976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (state << HistoryItem.STATE_PHONE_STATE_SHIFT);
169832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + bin + " to: "
169932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
170132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mPhoneServiceState = state;
170232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
170332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
170432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1705e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
1706627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
1707627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin;
1708f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneServiceState == ServiceState.STATE_POWER_OFF
1709f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                || mPhoneServiceState == ServiceState.STATE_OUT_OF_SERVICE) {
1710f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            // Ignore any signal strength changes when radio was turned off or out of service.
1711f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            return;
1712f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
1713e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (!signalStrength.isGsm()) {
1714e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            int dBm = signalStrength.getCdmaDbm();
1715f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (dBm >= -75) bin = SIGNAL_STRENGTH_GREAT;
1716f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else if (dBm >= -85) bin = SIGNAL_STRENGTH_GOOD;
1717f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else if (dBm >= -95)  bin = SIGNAL_STRENGTH_MODERATE;
1718f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else if (dBm >= -100)  bin = SIGNAL_STRENGTH_POOR;
1719f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1720e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        } else {
1721e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            int asu = signalStrength.getGsmSignalStrength();
1722e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1723e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT;
1724e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 8)  bin = SIGNAL_STRENGTH_GOOD;
1725e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 4)  bin = SIGNAL_STRENGTH_MODERATE;
1726e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else bin = SIGNAL_STRENGTH_POOR;
1727e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1728627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
17296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_SIGNAL_STRENGTH_MASK)
17306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT);
173132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: "
173232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1734627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
1735627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
1736627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1737627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthBin = bin;
1738627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1739627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1740627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1741627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1742627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
1743627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
1744627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
1745627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
1746627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
1747627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
1748627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1749627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
1750627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
1751627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1752627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
1753627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
1754627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
17556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_CDMA:
17566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_CDMA;
17576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
17586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_0:
17596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_0;
17606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
17616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_A:
17626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_A;
17636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
17646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_1xRTT:
17656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_1xRTT;
17666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
17676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSDPA:
17686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSDPA;
17696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
17706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSUPA:
17716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSUPA;
17726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
17736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_HSPA:
17746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_HSPA;
17756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
17766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_IDEN:
17776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_IDEN;
17786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
17796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                case TelephonyManager.NETWORK_TYPE_EVDO_B:
17806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    bin = DATA_CONNECTION_EVDO_B;
17816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    break;
1782627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
1783627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
1784627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1785627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1786627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
17873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData);
1788627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
17896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK)
17906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT);
179132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: "
179232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
17936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1794627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
1795627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
1796627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1797627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
1798627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
1799627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1800627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1801627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
180258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOnLocked() {
1803105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
18046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG;
180532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: "
180632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
1809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
1810105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1811105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
181358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOffLocked() {
1814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
18156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG;
181632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: "
181732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1819105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
1820105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
1821105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1822617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid >= 0) {
182358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked();
1824617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = -1;
1825617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1826105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1827244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1828244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOnLocked(int uid) {
1829244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mAudioOn) {
18306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG;
183132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: "
183232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1834244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = true;
1835244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.startRunningLocked(this);
1836244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
18372e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOnLocked();
1838244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1840244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOffLocked(int uid) {
1841244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mAudioOn) {
18426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG;
184332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: "
184432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1846244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = false;
1847244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.stopRunningLocked(this);
1848244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
18492e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOffLocked();
1850244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1851244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1852244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOnLocked(int uid) {
1853244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mVideoOn) {
18546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG;
185532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: "
185632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1858244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = true;
1859244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.startRunningLocked(this);
1860244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
18612e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOnLocked();
1862244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1863244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1864244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOffLocked(int uid) {
1865244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mVideoOn) {
18666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG;
186732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: "
186832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1870244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = false;
1871244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.stopRunningLocked(this);
1872244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
18732e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOffLocked();
1874244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1875244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
187658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningLocked(WorkSource ws) {
187758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (!mGlobalWifiRunning) {
18786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG;
187932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: "
188032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
18816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
188258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = true;
188358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.startRunningLocked(this);
188458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
188558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
188658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiRunningLocked();
188758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
188858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
188958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running");
1890d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1891d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1892d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
189358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) {
189458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
189558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = oldWs.size();
189658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
189758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked();
189858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
189958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            N = newWs.size();
190058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
190158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked();
190258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
190358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
190458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running");
190558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
190658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
190758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
190858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStoppedLocked(WorkSource ws) {
190958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (mGlobalWifiRunning) {
19106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RUNNING_FLAG;
191132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: "
191232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
191458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunning = false;
191558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.stopRunningLocked(this);
191658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            int N = ws.size();
191758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (int i=0; i<N; i++) {
191858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked();
191958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
192058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        } else {
192158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running");
1922d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1923d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1924d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1925105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
1926105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
19276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_BLUETOOTH_ON_FLAG;
192832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: "
192932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1931105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
1932105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
1933105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1934105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1935105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1936105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
1937105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
19386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG;
193932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: "
194032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
1942105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
1943105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
1944105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1945105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1946105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
194732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiFullLockNesting = 0;
194832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
1949105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
195032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
19516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
195232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: "
195332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
195532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
195632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting++;
19572e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked();
1958105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1959105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1960105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
196132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting--;
196232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
19636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
196432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: "
196532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
196732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
19682e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockReleasedLocked();
1969105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1970105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
197132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiScanLockNesting = 0;
197232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
1973105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
197432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
19756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
197632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: "
197732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
197932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
198032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting++;
19812e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked();
1982105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1983105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1984105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
198532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting--;
198632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
19876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG;
198832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: "
198932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
19906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
199132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
19922e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockReleasedLocked();
1993105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
19945347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
199532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiMulticastNesting = 0;
199632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
19975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabledLocked(int uid) {
199832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
19996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
200032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: "
200132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
200332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
200432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting++;
20052e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastEnabledLocked();
20065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
20075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
20085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabledLocked(int uid) {
200932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting--;
201032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
20116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
201232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: "
201332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
20146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(SystemClock.elapsedRealtime());
201532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
20162e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastDisabledLocked();
20175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
20185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
20197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) {
20207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
20217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
20227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockAcquiredLocked(ws.get(i));
20237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
20247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
20257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
20267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) {
20277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
20287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
20297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteFullWifiLockReleasedLocked(ws.get(i));
20307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
20317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
20327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
20337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteScanWifiLockAcquiredFromSourceLocked(WorkSource ws) {
20347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
20357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
20367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteScanWifiLockAcquiredLocked(ws.get(i));
20377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
20387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
20397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
20407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteScanWifiLockReleasedFromSourceLocked(WorkSource ws) {
20417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
20427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
20437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteScanWifiLockReleasedLocked(ws.get(i));
20447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
20457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
20467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
20477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) {
20487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
20497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
20507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastEnabledLocked(ws.get(i));
20517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
20527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
20537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
20547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) {
20557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        int N = ws.size();
20567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        for (int i=0; i<N; i++) {
20577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            noteWifiMulticastDisabledLocked(ws.get(i));
20587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
20597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
20607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
2062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which);
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2065617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public long getScreenBrightnessTime(int brightnessBin,
2066617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which) {
2067c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
2068617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                batteryRealtime, which);
2069617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
2070244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2071617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getInputEventCount(int which) {
2072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mInputEventCounter.getCountLocked(which);
2073617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
2074617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
2076c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which);
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2078244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2079627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
2080627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
2082627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2083627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
2084f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2085f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    @Override public long getPhoneSignalScanningTime(
2086f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            long batteryRealtime, int which) {
2087f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        return mPhoneSignalScanningTimer.getTotalTimeLocked(
2088f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                batteryRealtime, which);
2089f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
2090f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
2091617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneSignalStrengthCount(int dataType, int which) {
2092c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2093617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
2094617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2095627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
2096627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
2097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
2098627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
2099627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
2100627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
2101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneDataConnectionCount(int dataType, int which) {
2102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
2103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
2104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2105105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
2106c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which);
2107105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
210958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) {
211058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2111d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
2112d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
2113105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
2114c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which);
2115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2116105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
214358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        boolean mWifiRunning;
214458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        StopwatchTimer mWifiRunningTimer;
2145617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2146105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
2147c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mFullWifiLockTimer;
2148105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2149105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
2150c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mScanWifiLockTimer;
2151244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
21525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        boolean mWifiMulticastEnabled;
21535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        StopwatchTimer mWifiMulticastTimer;
2154244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2155244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mAudioTurnedOn;
2156244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mAudioTurnedOnTimer;
2157244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2158244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mVideoTurnedOn;
2159244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mVideoTurnedOnTimer;
21605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
2161617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter[] mUserActivityCounters;
2162617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        /**
21849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         * The transient wake stats we have collected for this uid's pids.
21859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn         */
21869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        final SparseArray<Pid> mPids = new SparseArray<Pid>();
21879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
219058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
219158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimers, mUnpluggables);
21920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
219358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mFullWifiLockTimers, mUnpluggables);
21940d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
219558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mScanWifiLockTimers, mUnpluggables);
21960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
219758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiMulticastTimers, mUnpluggables);
21980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
21990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables);
22000d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
22015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables);
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2223eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2224eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2228eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2229eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
22356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
22376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
22461719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff                    ? (TrafficStats.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2248eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2249eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
22556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (which == STATS_SINCE_UNPLUGGED) {
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
22576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else if (which == STATS_SINCE_CHARGED) {
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
226558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiRunningLocked() {
226658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (!mWifiRunning) {
226758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = true;
226858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer == null) {
226958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
227058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiRunningTimers, mUnpluggables);
22716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
227258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this);
2273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
227758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public void noteWifiStoppedLocked() {
227858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunning) {
227958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunning = false;
228058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this);
2281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2285105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
2286105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
2287105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
22886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer == null) {
22890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
229058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mFullWifiLockTimers, mUnpluggables);
22916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
2292105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
2293105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2294105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2295105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2296105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2297105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
2298105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
2299105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
2300105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
2301105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2302105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2303105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2304105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2305105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
2306105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
2307105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
23086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mScanWifiLockTimer == null) {
23090d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
231058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mScanWifiLockTimers, mUnpluggables);
23116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
2312105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
2313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2314105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2315105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2316105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2317105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
2318105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
2319105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
2320105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
2321105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
2322105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
23235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
23245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
23255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastEnabledLocked() {
23265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (!mWifiMulticastEnabled) {
23275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = true;
23286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer == null) {
23290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
233058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            mWifiMulticastTimers, mUnpluggables);
23316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
23325347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this);
23335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
23345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
23355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
23365347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
23375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastDisabledLocked() {
23385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (mWifiMulticastEnabled) {
23395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = false;
23405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this);
23415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
23425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
23435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
23446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
23456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOnLocked() {
23466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mAudioTurnedOn) {
23476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = true;
23486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer == null) {
23490d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
23506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
23516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
23526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
23536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2355244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
23566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
23576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteAudioTurnedOffLocked() {
23586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOn) {
23596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOn = false;
23606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
23616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
23626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
23636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
23646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
23656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOnLocked() {
23666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!mVideoTurnedOn) {
23676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = true;
23686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer == null) {
23690d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
23706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            null, mUnpluggables);
23716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
23726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
23736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
23746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
23756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
23766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
23776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public void noteVideoTurnedOffLocked() {
23786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOn) {
23796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOn = false;
23806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
23816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2382244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2383244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2384244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
238558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        public long getWifiRunningTime(long batteryRealtime, int which) {
238658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer == null) {
23876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
23886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
238958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
2390244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
2391244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
2392105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2393105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
23946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer == null) {
23956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
23966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2397c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
2398105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2399105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2400105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
2401105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
24026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer == null) {
24036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
24046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2405c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
2406105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
24075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
24085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
24095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public long getWifiMulticastTime(long batteryRealtime, int which) {
24106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer == null) {
24116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
24126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
24135347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime,
24145347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                          which);
24155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
24165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
24176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
24186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getAudioTurnedOnTime(long batteryRealtime, int which) {
24196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer == null) {
24206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
24216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
24226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
24236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
24246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
24256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        @Override
24266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        public long getVideoTurnedOnTime(long batteryRealtime, int which) {
24276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer == null) {
24286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return 0;
24296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
24306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
24316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
24326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
2433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2434617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteUserActivityLocked(int type) {
2435617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2436617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                initUserActivityLocked();
2437617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2438617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (type < 0) type = 0;
2439617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1;
24404cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUserActivityCounters[type].stepAtomic();
2441617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2442617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2443617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2444617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
2445617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
2446617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2447617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2448617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
2449617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
2450617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
2451617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
2452617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2453c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
2454617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2455617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
2456617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
2457617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2458617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2459617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
2460617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2461617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2462617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
24651719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff                    ? (TrafficStats.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2467244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
24686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        /**
24696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * Clear all stats for this uid.  Returns true if the uid is completely
24706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         * inactive so can be dropped.
24716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn         */
24726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        boolean reset() {
24736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean active = false;
24746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
247558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
247658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false);
247758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                active |= mWifiRunning;
24786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
24796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
24809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mFullWifiLockTimer.reset(BatteryStatsImpl.this, false);
24816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mFullWifiLockOut;
24826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
24836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer != null) {
24849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mScanWifiLockTimer.reset(BatteryStatsImpl.this, false);
24856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mScanWifiLockOut;
24866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
24876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
24889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mWifiMulticastTimer.reset(BatteryStatsImpl.this, false);
24896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mWifiMulticastEnabled;
24906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
24916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
24929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mAudioTurnedOnTimer.reset(BatteryStatsImpl.this, false);
24936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mAudioTurnedOn;
24946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
24956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
24969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false);
24976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                active |= mVideoTurnedOn;
24986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
24996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0;
25016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0;
25026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
25046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
25056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUserActivityCounters[i].reset(false);
25066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWakelockStats.size() > 0) {
25106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Wakelock>> it = mWakelockStats.entrySet().iterator();
25116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
25126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Wakelock> wakelockEntry = it.next();
25136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Wakelock wl = wakelockEntry.getValue();
25146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (wl.reset()) {
25156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
25166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
25176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
25186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
25196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mSensorStats.size() > 0) {
25226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<Integer, Sensor>> it = mSensorStats.entrySet().iterator();
25236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
25246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<Integer, Sensor> sensorEntry = it.next();
25256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Sensor s = sensorEntry.getValue();
25266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (s.reset()) {
25276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        it.remove();
25286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
25296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        active = true;
25306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
25316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mProcessStats.size() > 0) {
25346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Proc>> it = mProcessStats.entrySet().iterator();
25356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
25366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Proc> procEntry = it.next();
25376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    procEntry.getValue().detach();
25386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mProcessStats.clear();
25406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (mPids.size() > 0) {
25429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; !active && i<mPids.size(); i++) {
25439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    Pid pid = mPids.valueAt(i);
25449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    if (pid.mWakeStart != 0) {
25459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                        active = true;
25469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    }
25479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
25489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
25496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mPackageStats.size() > 0) {
25506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator();
25516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                while (it.hasNext()) {
25526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Map.Entry<String, Pkg> pkgEntry = it.next();
25536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    Pkg p = pkgEntry.getValue();
25546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    p.detach();
25556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (p.mServiceStats.size() > 0) {
25566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        Iterator<Map.Entry<String, Pkg.Serv>> it2
25576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                                = p.mServiceStats.entrySet().iterator();
25586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        while (it2.hasNext()) {
25596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            Map.Entry<String, Pkg.Serv> servEntry = it2.next();
25606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            servEntry.getValue().detach();
25616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
25626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
25636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mPackageStats.clear();
25656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPids.clear();
25689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
25696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (!active) {
257058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                if (mWifiRunningTimer != null) {
257158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    mWifiRunningTimer.detach();
25726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFullWifiLockTimer != null) {
25746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mFullWifiLockTimer.detach();
25756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mScanWifiLockTimer != null) {
25776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mScanWifiLockTimer.detach();
25786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mWifiMulticastTimer != null) {
25806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mWifiMulticastTimer.detach();
25816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mAudioTurnedOnTimer != null) {
25836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mAudioTurnedOnTimer.detach();
25846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mVideoTurnedOnTimer != null) {
25866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mVideoTurnedOnTimer.detach();
25876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mUserActivityCounters != null) {
25896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
25906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUserActivityCounters[i].detach();
25916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
25926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
25936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
25946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return !active;
25966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
25976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
263358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (mWifiRunningTimer != null) {
26346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
263558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer.writeToParcel(out, batteryRealtime);
26366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
2637617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
26386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mFullWifiLockTimer != null) {
26406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
26416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
2642617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
26436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
26446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mScanWifiLockTimer != null) {
26466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
26476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
26486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
26496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
26506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mWifiMulticastTimer != null) {
26526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
26536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer.writeToParcel(out, batteryRealtime);
26546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
26556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
26566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mAudioTurnedOnTimer != null) {
26586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
26596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime);
26606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
26616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
26626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mVideoTurnedOnTimer != null) {
26646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
26656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime);
26666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
26676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
26686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
26696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUserActivityCounters != null) {
2670617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
2671617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2672617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
2673617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
26746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
26756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
2676617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
26869e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) {
26879e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // We will just drop some random set of wakelocks if
26889e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // the previous run of the system was an older version
26899e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // that didn't impose a limit.
26909e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(wakelockName, wakelock);
26919e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
272758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mWifiRunning = false;
27286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
272958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
273058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiRunningTimers, mUnpluggables, in);
27316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
273258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                mWifiRunningTimer = null;
27336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2734105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
27356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
27360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
273758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mFullWifiLockTimers, mUnpluggables, in);
27386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
27396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mFullWifiLockTimer = null;
27406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
2741105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
27426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
27430d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mScanWifiLockTimer = new StopwatchTimer(Uid.this, SCAN_WIFI_LOCK,
274458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mScanWifiLockTimers, mUnpluggables, in);
27456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
27466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mScanWifiLockTimer = null;
27476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastEnabled = false;
27496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
27500d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
275158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        mWifiMulticastTimers, mUnpluggables, in);
2752617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
27536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mWifiMulticastTimer = null;
27546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mAudioTurnedOn = false;
27566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
27570d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
27586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
27596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
27606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mAudioTurnedOnTimer = null;
27616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mVideoTurnedOn = false;
27636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
27640d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
27656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        null, mUnpluggables, in);
27666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
27676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mVideoTurnedOnTimer = null;
27686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
27696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
2770617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2771617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2772617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
2773617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
27746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
27756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUserActivityCounters = null;
2776617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, type, pool, unpluggables, in);
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
28156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                boolean wlactive = false;
28166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerFull != null) {
28179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerFull.reset(BatteryStatsImpl.this, false);
28186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerPartial != null) {
28209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerPartial.reset(BatteryStatsImpl.this, false);
28216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mTimerWindow != null) {
28239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    wlactive |= !mTimerWindow.reset(BatteryStatsImpl.this, false);
28246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (!wlactive) {
28266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerFull != null) {
28276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull.detach();
28286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerFull = null;
28296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
28306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerPartial != null) {
28316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial.detach();
28326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerPartial = null;
28336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
28346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (mTimerWindow != null) {
28356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow.detach();
28366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mTimerWindow = null;
28376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
28386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return !wlactive;
28406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
2870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
2884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28870d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                return new StopwatchTimer(Uid.this, 0, pool, unpluggables, in);
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean reset() {
28919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (mTimer.reset(BatteryStatsImpl.this, true)) {
28926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mTimer = null;
28936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return true;
28946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
28956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return false;
28966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
28976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2910eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2911eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2937eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Amount of time the process was running in the foreground.
2938eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
2939eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mForegroundTime;
2940eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2941eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2957eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from a previous save.
2958eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
2959eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLoadedForegroundTime;
2960eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2961eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2977eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from the previous run
2978eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
2979eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLastForegroundTime;
2980eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2981eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2996eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
2997eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time since unplugged.
2998eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
2999eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mUnpluggedForegroundTime;
3000eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3001e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            SamplingCounter[] mSpeedBins;
3002e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3003287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            ArrayList<ExcessivePower> mExcessivePower;
30049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
3007e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[getCpuSpeedSteps()];
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3009e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
3014eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = mForegroundTime;
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
30216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
30226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                for (int i = 0; i < mSpeedBins.length; i++) {
30236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
30246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
30256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mUnpluggables.remove(c);
30266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = null;
30276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
30286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
30296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
30306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
3031287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public int countExcessivePowers() {
3032287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                return mExcessivePower != null ? mExcessivePower.size() : 0;
30339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
30349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3035287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public ExcessivePower getExcessivePower(int i) {
3036287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower != null) {
3037287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    return mExcessivePower.get(i);
30389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
30399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                return null;
30409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
30419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
30429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            public void addExcessiveWake(long overTime, long usedTime) {
3043287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3044287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
30459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
3046287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3047287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_WAKE;
30489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.overTime = overTime;
30499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                ew.usedTime = usedTime;
3050287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
30519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
30529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3053287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            public void addExcessiveCpu(long overTime, long usedTime) {
3054287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
3055287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = new ArrayList<ExcessivePower>();
3056287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                }
3057287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ExcessivePower ew = new ExcessivePower();
3058287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.type = ExcessivePower.TYPE_CPU;
3059287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.overTime = overTime;
3060287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                ew.usedTime = usedTime;
3061287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower.add(ew);
3062287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
3063287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
3064287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            void writeExcessivePowerToParcelLocked(Parcel out) {
3065287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                if (mExcessivePower == null) {
30669adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeInt(0);
30679adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    return;
30689adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
30699adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3070287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                final int N = mExcessivePower.size();
30719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                out.writeInt(N);
30729adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3073287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = mExcessivePower.get(i);
3074287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    out.writeInt(ew.type);
30759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.overTime);
30769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    out.writeLong(ew.usedTime);
30779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
30789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
30799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3080287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            void readExcessivePowerFromParcelLocked(Parcel in) {
30819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                final int N = in.readInt();
30829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                if (N == 0) {
3083287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower = null;
30849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    return;
30859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
30869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3087287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                mExcessivePower = new ArrayList<ExcessivePower>();
30889adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                for (int i=0; i<N; i++) {
3089287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ExcessivePower ew = new ExcessivePower();
3090287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ew.type = in.readInt();
30919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.overTime = in.readLong();
30929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    ew.usedTime = in.readLong();
3093287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    mExcessivePower.add(ew);
30949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
30959adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
30969adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
3100eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mForegroundTime);
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
3104eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLoadedForegroundTime);
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
3108eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mUnpluggedForegroundTime);
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
3110e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3111e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                out.writeInt(mSpeedBins.length);
3112e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
31136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[i];
31146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (c != null) {
31156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(1);
31166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.writeToParcel(out);
31176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else {
31186b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        out.writeInt(0);
31196b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3120e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
31219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3122287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                writeExcessivePowerToParcelLocked(out);
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
3128eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime = in.readLong();
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
3132eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLoadedForegroundTime = in.readLong();
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
31343bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastUserTime = 0;
31353bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastSystemTime = 0;
31363bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastForegroundTime = 0;
31373bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastStarts = 0;
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
3140eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = in.readLong();
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
3142e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3143e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                int bins = in.readInt();
31446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                int steps = getCpuSpeedSteps();
31456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mSpeedBins = new SamplingCounter[bins >= steps ? bins : steps];
3146e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < bins; i++) {
31476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (in.readInt() != 0) {
31486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        mSpeedBins[i] = new SamplingCounter(mUnpluggables, in);
31496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3150e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
31519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
3152287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                readExcessivePowerFromParcelLocked(in);
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3164eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public void addForegroundTimeLocked(long ttime) {
3165eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime += ttime;
3166eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3167eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
31816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
31976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
3205eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public long getForegroundTime(int which) {
3206eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                long val;
3207eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                if (which == STATS_LAST) {
3208eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mLastForegroundTime;
3209eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                } else {
3210eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mForegroundTime;
3211eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    if (which == STATS_CURRENT) {
3212eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mLoadedForegroundTime;
32136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
3214eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mUnpluggedForegroundTime;
3215eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    }
3216eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                }
3217eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                return val;
3218eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
3219eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
3220eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
32296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3235e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3236e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /* Called by ActivityManagerService when CPU times are updated. */
3237e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public void addSpeedStepTimes(long[] values) {
3238e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length && i < values.length; i++) {
32396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    long amt = values[i];
32406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    if (amt != 0) {
32416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        SamplingCounter c = mSpeedBins[i];
32426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        if (c == null) {
32436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                            mSpeedBins[i] = c = new SamplingCounter(mUnpluggables);
32446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        }
32456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        c.addCountAtomic(values[i]);
32466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    }
3247e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3248e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
3249e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3250e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            @Override
3251e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public long getTimeAtCpuSpeedStep(int speedStep, int which) {
3252e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                if (speedStep < mSpeedBins.length) {
32536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    SamplingCounter c = mSpeedBins[speedStep];
32546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return c != null ? c.getCountLocked(which) : 0;
3255e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                } else {
3256e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return 0;
3257e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
3258e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            void detach() {
33066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(this);
33076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
33086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
33123bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                mLastWakeups = 0;
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
33546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    } else if (which == STATS_SINCE_UNPLUGGED) {
33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                void detach() {
34706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mUnpluggables.remove(this);
34716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
34726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
34853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStartTime = 0;
34863bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastStarts = 0;
34873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLastLaunches = 0;
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
35746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
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                @Override
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
35916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
36086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        } else if (which == STATS_SINCE_UNPLUGGED) {
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3644b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        public SparseArray<? extends Pid> getPidStats() {
3645b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn            return mPids;
3646b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        }
3647b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn
36489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public Pid getPidStatsLocked(int pid) {
36499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Pid p = mPids.get(pid);
36509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p == null) {
36519adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p = new Pid();
36529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                mPids.put(pid, p);
36539adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
36549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            return p;
36559adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
36569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
36899e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) {
36909e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    name = BATCHED_WAKELOCK_NAME;
36919e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = mWakelockStats.get(name);
36929e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
36939e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (wl == null) {
36949e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = new Wakelock();
36959e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(name, wl);
36969e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
37030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL,
37040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mPartialTimers, mUnpluggables);
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
37110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL,
37120d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mFullTimers, mUnpluggables);
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
37190d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                        t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW,
37200d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                                mWindowTimers, mUnpluggables);
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
3744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mUnpluggables);
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStartWakeLocked(int pid, String name, int type) {
3753c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37571ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
37589adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = getPidStatsLocked(pid);
3759b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p.mWakeStart == 0) {
3760b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                    p.mWakeStart = SystemClock.elapsedRealtime();
3761b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                }
37629adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37659adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void noteStopWakeLocked(int pid, String name, int type) {
3766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37701ebccf531d1049853b3b0630035434619682c016Dianne Hackborn            if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
37719adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                Pid p = mPids.get(pid);
3772b8071d790a32dc715c0fd6d4e7e1bbea6c8f7a02Dianne Hackborn                if (p != null && p.mWakeStart != 0) {
37739adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeSum += SystemClock.elapsedRealtime() - p.mWakeStart;
37749adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                    p.mWakeStart = 0;
37759adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                }
37769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
37779adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        }
37789adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
37799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) {
37809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            Proc p = getProcessStatsLocked(proc);
37819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            if (p != null) {
37829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn                p.addExcessiveWake(overTime, usedTime);
37839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            }
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3786287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) {
3787287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            Proc p = getProcessStatsLocked(proc);
3788287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            if (p != null) {
3789287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                p.addExcessiveCpu(overTime, usedTime);
3790287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
3791287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        }
3792287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
3794c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
3802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
3809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
3816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
3819244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
38281afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = new JournaledFile(new File(filename), new File(filename + ".tmp"));
38290d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = new MyHandler();
38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
38310d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables);
3832617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
38330d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mUnpluggables);
3834617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3835617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
38360d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables);
3837627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
38380d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null, mUnpluggables);
3839627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
38400d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables);
3841627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
38420d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null, mUnpluggables);
3843627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
38440d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -3, null, mUnpluggables);
384558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -4, null, mUnpluggables);
38460d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -5, null, mUnpluggables);
38470d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mAudioOnTimer = new StopwatchTimer(null, -6, null, mUnpluggables);
38480d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mVideoOnTimer = new StopwatchTimer(null, -7, null, mUnpluggables);
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
38506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
38569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
3857633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
38586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = 0;
3859633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
38603bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = 0;
38613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = 0;
38629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
38651afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
38660d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mHandler = null;
38679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
38689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38700d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    public void setCallback(BatteryCallback cb) {
38710d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mCallback = cb;
38720d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn    }
38730d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
3874e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public void setNumSpeedSteps(int steps) {
3875e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (sNumSpeedSteps == 0) sNumSpeedSteps = steps;
3876e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
3877e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3878f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void setRadioScanningTimeout(long timeout) {
3879f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneSignalScanningTimer != null) {
3880f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.setTimeout(timeout);
3881f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
3882f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
3883f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
3884ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    private HistoryItem mHistoryIterator;
3885ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
3886ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public boolean startIteratingHistoryLocked() {
3887ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return (mHistoryIterator = mHistory) != null;
3888ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
3889ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
3890ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public boolean getNextHistoryLocked(HistoryItem out) {
3891ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        HistoryItem cur = mHistoryIterator;
3892ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (cur == null) {
3893ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            return false;
3894ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
3895ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        out.setTo(cur);
3896ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mHistoryIterator = cur.next;
3897ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        return true;
3898ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
3899ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
39016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public HistoryItem getHistory() {
390232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        return mHistory;
390332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
390432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
390532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    @Override
3906b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    public long getHistoryBaseTime() {
3907b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn        return mHistoryBaseTime;
3908b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    }
3909b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn
3910b5e3165129a5871cf679a67d9e9323ffad3d4902Dianne Hackborn    @Override
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    public boolean isScreenOn() {
39209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        return mScreenOn;
39219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn    }
39229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn
39236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void initTimes() {
39246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryRealtime = mTrackBatteryPastUptime = 0;
39256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mBatteryUptime = mTrackBatteryPastRealtime = 0;
39266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
39276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
39286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
39296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
39306b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
39316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
39326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void resetAllStatsLocked() {
39336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mStartCount = 0;
39346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        initTimes();
39359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mScreenOnTimer.reset(this, false);
39366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
39379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mScreenBrightnessTimer[i].reset(this, false);
39386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
39396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mInputEventCounter.reset(false);
39409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneOnTimer.reset(this, false);
39419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mAudioOnTimer.reset(this, false);
39429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mVideoOnTimer.reset(this, false);
39436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
39449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneSignalStrengthsTimer[i].reset(this, false);
39456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
39469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mPhoneSignalScanningTimer.reset(this, false);
39476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
39489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mPhoneDataConnectionsTimer[i].reset(this, false);
39496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
39509adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mWifiOnTimer.reset(this, false);
395158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.reset(this, false);
39529adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mBluetoothOnTimer.reset(this, false);
39536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
39546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        for (int i=0; i<mUidStats.size(); i++) {
39556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mUidStats.valueAt(i).reset()) {
39566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUidStats.remove(mUidStats.keyAt(i));
39576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                i--;
39586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
39596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
39606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
39616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mKernelWakelockStats.size() > 0) {
39626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            for (SamplingTimer timer : mKernelWakelockStats.values()) {
39636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggables.remove(timer);
39646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
39656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mKernelWakelockStats.clear();
39666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
39676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
39686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        clearHistoryLocked();
39696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    }
39706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
39716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    void setOnBattery(boolean onBattery, int oldStatus, int level) {
39729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
39736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean doWrite = false;
39740d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE);
39750d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            m.arg1 = onBattery ? 1 : 0;
39760d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mHandler.sendMessage(m);
39776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mOnBattery = mOnBatteryInternal = onBattery;
39786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
39796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            long uptime = SystemClock.uptimeMillis() * 1000;
39806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            long mSecRealtime = SystemClock.elapsedRealtime();
39816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            long realtime = mSecRealtime * 1000;
39826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (onBattery) {
39836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                // We will reset our status if we are unplugging after the
39846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                // battery was last full, or the level is at 100, or
39856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                // we have gone through a significant charge (from a very low
39866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                // level to a now very high level).
39876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (oldStatus == BatteryManager.BATTERY_STATUS_FULL
39886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        || level >= 100
39896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        || (mDischargeCurrentLevel < 20 && level > 90)) {
39906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    doWrite = true;
39916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    resetAllStatsLocked();
39926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mDischargeStartLevel = level;
39933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mLowDischargeAmountSinceCharge = 0;
39943bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    mHighDischargeAmountSinceCharge = 0;
39956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
39966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                updateKernelWakelocksLocked();
39976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryLevel = (byte)level;
39986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
39996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: "
40006b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
40016b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                addHistoryRecordLocked(mSecRealtime);
40026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mTrackBatteryUptimeStart = uptime;
40036b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mTrackBatteryRealtimeStart = realtime;
40046b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
40056b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
40066b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mDischargeCurrentLevel = mDischargeUnplugLevel = level;
40076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
40086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
40096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                updateKernelWakelocksLocked();
40106b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryLevel = (byte)level;
40116b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
40126b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: "
40136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                        + Integer.toHexString(mHistoryCur.states));
40146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                addHistoryRecordLocked(mSecRealtime);
40156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
40166b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
40176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mDischargeCurrentLevel = level;
40183bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (level < mDischargeUnplugLevel) {
401999d0452ddc0a0435030a462bda9f4d57b58bad9aDianne Hackborn                    mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;
402099d0452ddc0a0435030a462bda9f4d57b58bad9aDianne Hackborn                    mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level;
40213bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                }
40226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
40236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
40246b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) {
40256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (mFile != null) {
4026ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    writeAsyncLocked();
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4031633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
40326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    // This should probably be exposed in the API, though it's not critical
40336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    private static final int BATTERY_PLUGGED_NONE = 0;
40346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
40356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void setBatteryState(int status, int health, int plugType, int level,
40366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int temp, int volt) {
40376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
40386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        int oldStatus = mHistoryCur.batteryStatus;
40396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (!mHaveBatteryLevel) {
40406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHaveBatteryLevel = true;
40416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // We start out assuming that the device is plugged in (not
40426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // on battery).  If our first report is now that we are indeed
40436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // plugged in, then twiddle our state to correctly reflect that
40446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // since we won't be going through the full setOnBattery().
40456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (onBattery == mOnBattery) {
40466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (onBattery) {
40476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
40486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                } else {
40496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
40506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                }
40516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
40526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            oldStatus = status;
40536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
40546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (onBattery) {
405532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mDischargeCurrentLevel = level;
40566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mRecordingHistory = true;
40576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
40586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (onBattery != mOnBattery) {
405932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
40606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.batteryStatus = (byte)status;
40616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.batteryHealth = (byte)health;
40626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.batteryPlugType = (byte)plugType;
40636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.batteryTemperature = (char)temp;
40646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mHistoryCur.batteryVoltage = (char)volt;
40656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            setOnBattery(onBattery, oldStatus, level);
40666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        } else {
40676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            boolean changed = false;
40686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryCur.batteryLevel != level) {
40696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryLevel = (byte)level;
40706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                changed = true;
40716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
40726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryCur.batteryStatus != status) {
40736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryStatus = (byte)status;
40746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                changed = true;
40756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
40766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryCur.batteryHealth != health) {
40776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryHealth = (byte)health;
40786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                changed = true;
40796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
40806b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryCur.batteryPlugType != plugType) {
40816b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryPlugType = (byte)plugType;
40826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                changed = true;
40836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
40846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryCur.batteryTemperature != temp) {
40856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryTemperature = (char)temp;
40866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                changed = true;
40876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
40886b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (mHistoryCur.batteryVoltage != volt) {
40896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryCur.batteryVoltage = (char)volt;
40906b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                changed = true;
40916b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
40926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (changed) {
40936b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                addHistoryRecordLocked(SystemClock.elapsedRealtime());
40946b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
40956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
40966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
40976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // We don't record history while we are plugged in and fully charged.
40986b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            // The next time we are unplugged, history will be cleared.
40996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mRecordingHistory = false;
410032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
4101633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
4102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
4103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
4104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
4105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
4106d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        if (m == null) {
4107d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            // Not crashing might make board bringup easier.
41081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "Couldn't get kernel wake lock stats");
4109d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            return;
4110d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        }
4111d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen
4112c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
4113c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
4114c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
4115c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
4116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
4117c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
4118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
4119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
4120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
4121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4122c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
4123c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
4124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
4125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
4127c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
4128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
4129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
4130c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
4131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
4132c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
4133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
4134c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
41449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
41496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart);
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
41526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
41559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
41606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart);
41619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
41629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
41636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
41649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
41669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
41699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
41709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
41716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
41769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
41776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
41866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_CHARGED:
41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
41889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
41926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            case STATS_SINCE_UNPLUGGED:
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
41949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
41969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
41999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
42009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
42019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
42029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
42049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
42079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
42089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
42169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
42283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long getTcpBytes(long current, long[] dataBytes, int which) {
42293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (which == STATS_LAST) {
42303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return dataBytes[STATS_LAST];
42313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
42326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (which == STATS_SINCE_UNPLUGGED) {
42336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                if (dataBytes[STATS_SINCE_UNPLUGGED] < 0) {
42343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return dataBytes[STATS_LAST];
42353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                } else {
42366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                    return current - dataBytes[STATS_SINCE_UNPLUGGED];
42373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                }
42386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else if (which == STATS_SINCE_CHARGED) {
42396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_SINCE_CHARGED];
42403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            }
42413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return current - dataBytes[STATS_CURRENT];
42423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
42433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
42443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
42453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
42463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesSent(int which) {
42471719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getMobileTxBytes(), mMobileDataTx, which);
42483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
42493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
42503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
42513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesReceived(int which) {
42521719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getMobileRxBytes(), mMobileDataRx, which);
42533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
42543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
42553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
42563718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesSent(int which) {
42571719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getTotalTxBytes(), mTotalDataTx, which);
42583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
42593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
42603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
42613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesReceived(int which) {
42621719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getTotalRxBytes(), mTotalDataRx, which);
42633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
42643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
4265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4266633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
4267105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4268633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
4269105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4270105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
4271105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
4272633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
42736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return mDischargeUnplugLevel;
4274105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
4275105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
4276105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
4277633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
4278105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
4279633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
4280105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
4281105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
4282105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
4283633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
4284633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return mDischargeCurrentLevel;
4285105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
42869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4287e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    @Override
42883bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getLowDischargeAmountSinceCharge() {
42893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
42903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            return mLowDischargeAmountSinceCharge;
42913bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
42923bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
42933bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
42943bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
42953bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public int getHighDischargeAmountSinceCharge() {
42963bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        synchronized(this) {
42973bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            return mHighDischargeAmountSinceCharge;
42983bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        }
42993bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
43003bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
43013bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    @Override
4302e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public int getCpuSpeedSteps() {
4303e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return sNumSpeedSteps;
4304e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
4305e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
43109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
43119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
43139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
43149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
43169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
43209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
43229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
432432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
43309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
43319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
43329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
433532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * Retrieve the statistics object for a particular process, given
433632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * the name of the process.
433732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @param name process name
433832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @return the statistics object for the process
433932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     */
4340819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public Uid.Proc getProcessStatsLocked(String name, int pid) {
434132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        int uid;
434232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (mUidCache.containsKey(name)) {
434332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            uid = mUidCache.get(name);
434432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        } else {
4345819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani            uid = Process.getUidForPid(pid);
434632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            mUidCache.put(name, uid);
434732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
434832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        Uid u = getUidStatsLocked(uid);
434932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        return u.getProcessStatsLocked(name);
435032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
435132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
435232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    /**
43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
43559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
43599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
43639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
43649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
43659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
43669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
43679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
437058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    /**
437158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * Massage data to distribute any reasonable work down to more specific
437258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     * owners.  Must only be called on a dead BatteryStats object!
437358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn     */
437458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void distributeWorkLocked(int which) {
437558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        // Aggregate all CPU time associated with WIFI.
437658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        Uid wifiUid = mUidStats.get(Process.WIFI_UID);
437758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        if (wifiUid != null) {
437858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            long uSecTime = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which);
437958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            for (Uid.Proc proc : wifiUid.mProcessStats.values()) {
438058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                long totalRunningTime = getGlobalWifiRunningTime(uSecTime, which);
438158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<mUidStats.size(); i++) {
438258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    Uid uid = mUidStats.valueAt(i);
438358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (uid.mUid != Process.WIFI_UID) {
438458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        long uidRunningTime = uid.getWifiRunningTime(uSecTime, which);
438558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (uidRunningTime > 0) {
438658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*");
438758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            long time = proc.getUserTime(which);
438858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
438958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mUserTime += time;
439058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mUserTime -= time;
439158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getSystemTime(which);
439258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
439358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mSystemTime += time;
439458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mSystemTime -= time;
439558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = proc.getForegroundTime(which);
439658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            time = (time*uidRunningTime)/totalRunningTime;
439758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            uidProc.mForegroundTime += time;
439858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            proc.mForegroundTime -= time;
439958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            for (int sb=0; sb<proc.mSpeedBins.length; sb++) {
440058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                SamplingCounter sc = proc.mSpeedBins[sb];
440158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                if (sc != null) {
440258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = sc.getCountLocked(which);
440358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    time = (time*uidRunningTime)/totalRunningTime;
440458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    SamplingCounter uidSc = uidProc.mSpeedBins[sb];
440558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    if (uidSc == null) {
440658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidSc = new SamplingCounter(mUnpluggables);
440758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                        uidProc.mSpeedBins[sb] = uidSc;
440858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    }
440958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    uidSc.mCount.addAndGet((int)time);
441058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                    sc.mCount.addAndGet((int)-time);
441158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                                }
441258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            }
441358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            totalRunningTime -= uidRunningTime;
441458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
441558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
441658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
441758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            }
441858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
441958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
442058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
44216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void shutdownLocked() {
4422ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSyncLocked();
44236b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mShuttingDown = true;
44241afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    }
44256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4426ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    Parcel mPendingWrite = null;
4427ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    final ReentrantLock mWriteLock = new ReentrantLock();
4428ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4429ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeAsyncLocked() {
4430ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(false);
4431ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4432ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4433ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void writeSyncLocked() {
4434ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeLocked(true);
4435ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4436ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4437ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    void writeLocked(boolean sync) {
44381afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
44391afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "writeLocked: no file associated with this instance");
44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        if (mShuttingDown) {
44446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            return;
44456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        }
44466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
4447ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        Parcel out = Parcel.obtain();
4448ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        writeSummaryToParcel(out);
4449ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mLastWriteTime = SystemClock.elapsedRealtime();
4450ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4451ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (mPendingWrite != null) {
4452ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite.recycle();
4453ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4454ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        mPendingWrite = out;
4455ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4456ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        if (sync) {
4457ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            commitPendingDataToDisk();
4458ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } else {
4459ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            Thread thr = new Thread("BatteryStats-Write") {
4460ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                @Override
4461ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                public void run() {
4462ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
4463ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                    commitPendingDataToDisk();
4464ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn                }
4465ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            };
4466ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            thr.start();
4467ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4468ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    }
4469ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4470ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn    public void commitPendingDataToDisk() {
4471f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn        final Parcel next;
4472ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        synchronized (this) {
4473ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next = mPendingWrite;
4474ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mPendingWrite = null;
4475f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            if (next == null) {
4476f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn                return;
4477f47d8f272c13f0fd264d5a71bcff1c18da10d854Dianne Hackborn            }
4478ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
4479ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.lock();
4480ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        }
4481ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
44831afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite());
4484ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            stream.write(next.marshall());
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
44868bdf5935c0db4a66ab33a10b43398d2523cfa15dDianne Hackborn            FileUtils.sync(stream);
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
44881afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            mFile.commit();
44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
44901afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "Error writing battery statistics", e);
4491ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mFile.rollback();
4492ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn        } finally {
4493ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            next.recycle();
4494ce2ef766cad1bb186ea522f76c4ac6a8bb3dfa87Dianne Hackborn            mWriteLock.unlock();
44959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
45009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
45019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
45029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
45039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
45049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
45059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
45069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
45099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
45221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
45231afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readLocked: no file associated with this instance");
45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
45301afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            File file = mFile.chooseForRead();
45311afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (!file.exists()) {
45321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45341afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileInputStream stream = new FileInputStream(file);
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
45441afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.e("BatteryStats", "Error reading battery statistics", e);
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn
45476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        addHistoryRecordLocked(SystemClock.elapsedRealtime(), HistoryItem.CMD_START);
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
455432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    void readHistory(Parcel in) {
455532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mHistory = mHistoryEnd = mHistoryCache = null;
45566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mHistoryBaseTime = 0;
455732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        long time;
455832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        while ((time=in.readLong()) >= 0) {
45596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            HistoryItem rec = new HistoryItem(time, in);
45606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            addHistoryRecordLocked(rec);
45616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (rec.time > mHistoryBaseTime) {
45626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                mHistoryBaseTime = rec.time;
45636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
456432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
45651e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn
45661e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn        long oldnow = SystemClock.elapsedRealtime() - (5*60*100);
45671e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn        if (oldnow > 0) {
45681e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // If the system process has restarted, but not the entire
45691e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // system, then the mHistoryBaseTime already accounts for
45701e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // much of the elapsed time.  We thus want to adjust it back,
45711e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // to avoid large gaps in the data.  We determine we are
45721e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // in this case by arbitrarily saying it is so if at this
45731e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            // point in boot the elapsed time is already more than 5 seconds.
45741e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn            mHistoryBaseTime -= oldnow;
45751e4b9f3936d6f357e89360293e05a0e16d5fa440Dianne Hackborn        }
457632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
457732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
457832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    void writeHistory(Parcel out) {
45796b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        HistoryItem rec = mHistory;
458032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        while (rec != null) {
458132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (rec.time >= 0) rec.writeToParcel(out, 0);
458232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            rec = rec.next;
458332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
458432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        out.writeLong(-1);
458532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
458632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
45899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
45901afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readFromParcel: version got " + version
45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        readHistory(in);
459632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
45979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
45989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
45999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
46009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
46019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
46026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
4603633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
46043bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
46053bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
4606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
46079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
46089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
46109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
4611617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
4612617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
4613617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4614617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
46159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
46169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
4617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
4618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
4619627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
4620f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in);
4621627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
4622627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
4623627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
4624105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
4625105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
462658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
462758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in);
4628105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
4629105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
46321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NKW > 10000) {
46331afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW);
46341afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
46351afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
4636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
4637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
4638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
4639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
4640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4642e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
4643e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
4644e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
46461afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NU > 10000) {
46471afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many uids " + NU);
46481afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
46491afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
46529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
46539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
46549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
465558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            u.mWifiRunning = false;
46566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
465758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.readSummaryFromParcelLocked(in);
46586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
4659105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
46606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
46616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
46626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
4663105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
46646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
46656b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
46666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
46675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastEnabled = false;
46686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
46696b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
46706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
46716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mAudioTurnedOn = false;
46726b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
46736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in);
46746b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
46756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            u.mVideoTurnedOn = false;
46766b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (in.readInt() != 0) {
46776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in);
46786b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
46795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
4680617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
4681617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
4682617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
4683617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
4684617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
4685617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
4686617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
4687617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
4688617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
46899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
46901afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NW > 10000) {
46911afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many wake locks " + NW);
46921afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
46931afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
47009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
47081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
47091afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many sensors " + NP);
47101afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
47111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
47129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
47169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
47179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
47211afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
47221afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many processes " + NP);
47231afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
47241afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
47259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
47289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
47309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
473158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                int NSB = in.readInt();
473258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                p.mSpeedBins = new SamplingCounter[NSB];
473358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                for (int i=0; i<NSB; i++) {
473458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    if (in.readInt() != 0) {
473558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i] = new SamplingCounter(mUnpluggables);
473658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        p.mSpeedBins[i].readSummaryFromParcelLocked(in);
473758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
473858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                }
4739287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                p.readExcessivePowerFromParcelLocked(in);
47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
47431afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
47441afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many packages " + NP);
47451afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
47461afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
47489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
47499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
47559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
47569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
47589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
47599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
47629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
47639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
47689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
47699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
47719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
47739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
47749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
47759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
47769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
47779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
47799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
478032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        writeHistory(out);
478132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
47829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
47836b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED));
47846b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
47856b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED));
47866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
47876b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
4788633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
47893bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mLowDischargeAmountSinceCharge);
47903bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mHighDischargeAmountSinceCharge);
47919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
4793617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
4794617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
4795617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4796617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
47979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
4798627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
4799627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
4800627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
4801f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
4802627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
4803627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
4804627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
4805105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
480658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
4807105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
48089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
4810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
4811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
4812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
4813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
4814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
4815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
4816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
4817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
4818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
4819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
4820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
4821e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
48229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
48239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
4827105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
482858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            if (u.mWifiRunningTimer != null) {
48296b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
483058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
48316b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
48326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
48336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
48346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mFullWifiLockTimer != null) {
48356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
48366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
48376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
48386b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
48396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
48406b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mScanWifiLockTimer != null) {
48416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
48426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
48436b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
48446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
48456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
48466b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mWifiMulticastTimer != null) {
48476b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
48486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL);
48496b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
48506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
48516b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
48526b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mAudioTurnedOnTimer != null) {
48536b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
48546b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
48556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
48566b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
48576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
48586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            if (u.mVideoTurnedOnTimer != null) {
48596b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(1);
48606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
48616b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            } else {
48626b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn                out.writeInt(0);
48636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            }
48649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4865617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
4866617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
4867617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
4868617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
4869617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
4870617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
4871617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
4872617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
4873617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
48749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
48759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
48769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
48779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
48789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
48799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
48809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
48819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
48829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
48839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
48849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
48859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
48869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
48879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
48889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
48899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
48909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
48919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
48929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
48939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
48949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
48959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
48969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
48979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
48989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
48999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
49039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
49049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
49059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
49069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
49079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
49089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
49099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
49109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
49119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
49129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
49139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
49149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
49159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
49199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
49209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
49219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
49229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
49239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
49249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
49259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
49269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
49279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
492858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    final int N = ps.mSpeedBins.length;
492958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    out.writeInt(N);
493058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    for (int i=0; i<N; i++) {
493158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        if (ps.mSpeedBins[i] != null) {
493258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(1);
493358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            ps.mSpeedBins[i].writeSummaryFromParcelLocked(out);
493458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        } else {
493558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                            out.writeInt(0);
493658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                        }
493758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn                    }
4938287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    ps.writeExcessivePowerToParcelLocked(out);
49399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
49439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
49449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
49459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
49469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
49479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
49489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
49499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
49509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
49519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
49529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
49539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
49549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
49559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
49569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
49579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
49589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
49599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
49609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
49619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
49629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
49639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
49649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
49659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED));
49676b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED));
49689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
49729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
49739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
49769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
49779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
49789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
49799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
498132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        readHistory(in);
498232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
49839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
49849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
49853bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastUptime = 0;
49869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
49873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mBatteryLastRealtime = 0;
49889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
49890d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables, in);
4990617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
49910d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i,
49920d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
4993617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
4994617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
49959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
49960d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
4997627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
49980d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i,
49990d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5000627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
50010d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mUnpluggables, in);
5002627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
50030d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i,
50040d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn                    null, mUnpluggables, in);
5005627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5006105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
50070d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mWifiOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
500858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunning = false;
500958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
5010105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
50110d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn        mBluetoothOnTimer = new StopwatchTimer(null, -2, null, mUnpluggables, in);
50129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
50139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
50143bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastUptime = 0;
50159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
50169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
50173bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLastRealtime = 0;
50189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
50199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
50209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
50219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
50229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
50239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
50249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
50259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
50266b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mDischargeUnplugLevel = in.readInt();
5027633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
50283bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mLowDischargeAmountSinceCharge = in.readInt();
50293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        mHighDischargeAmountSinceCharge = in.readInt();
50309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
50319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50323718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_LAST] = in.readLong();
50336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataRx[STATS_SINCE_UNPLUGGED] = -1;
50343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_LAST] = in.readLong();
50356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mMobileDataTx[STATS_SINCE_UNPLUGGED] = -1;
50363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_LAST] = in.readLong();
50376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataRx[STATS_SINCE_UNPLUGGED] = -1;
50383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_LAST] = in.readLong();
50396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mTotalDataTx[STATS_SINCE_UNPLUGGED] = -1;
50403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
50413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = in.readLong();
50423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
50433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
50443f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = in.readInt();
50453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
50463f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
5047c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
5048c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
5049c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
5050c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
5051c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
5052244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel
5053c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
5054c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
5055c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
5056c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5057c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
50589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
50599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
50609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
506158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiRunningTimers.clear();
506258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mFullWifiLockTimers.clear();
506358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mScanWifiLockTimers.clear();
506458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mWifiMulticastTimers.clear();
50659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5066e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
5067e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
50689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
50699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
50709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
50719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
50729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
50793bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, true, flags);
50803bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    }
50813bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn
50823bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    public void writeToParcelWithoutUids(Parcel out, int flags) {
50833bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        writeToParcelLocked(out, false, flags);
50849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
50873bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn    void writeToParcelLocked(Parcel out, boolean inclUids, int flags) {
50889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
50899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
50909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
50919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
509432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
509532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        writeHistory(out);
509632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
5101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
5102617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
5103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
5104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
5106627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
5107627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
5108627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5109f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime);
5110627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
5111627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
5112627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
5113105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
511458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        mGlobalWifiRunningTimer.writeToParcel(out, batteryRealtime);
5115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
51276b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeInt(mDischargeUnplugLevel);
5128633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
51293bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mLowDischargeAmountSinceCharge);
51303bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        out.writeInt(mHighDischargeAmountSinceCharge);
51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesReceived(STATS_SINCE_UNPLUGGED));
51346b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getMobileTcpBytesSent(STATS_SINCE_UNPLUGGED));
51356b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesReceived(STATS_SINCE_UNPLUGGED));
51366b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        out.writeLong(getTotalTcpBytesSent(STATS_SINCE_UNPLUGGED));
51373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
51383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Write radio uptime for data
51393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeLong(getRadioDataUptime());
51403f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
51413f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeInt(getBluetoothPingCount());
51423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
51433bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
51443bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(mKernelWakelockStats.size());
51453bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
51463bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                SamplingTimer kwlt = ent.getValue();
51473bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                if (kwlt != null) {
51483bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(1);
51493bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeString(ent.getKey());
51503bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
51513bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                } else {
51523bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                    out.writeInt(0);
51533bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                }
5154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
51553bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
51563bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
5157c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
5158e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
5159e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
5160e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
51613bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        if (inclUids) {
51623bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            int size = mUidStats.size();
51633bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(size);
51643bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            for (int i = 0; i < size; i++) {
51653bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                out.writeInt(mUidStats.keyAt(i));
51663bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                Uid uid = mUidStats.valueAt(i);
51679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51683bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn                uid.writeToParcelLocked(out, batteryRealtime);
51693bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            }
51703bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn        } else {
51713bee5af8162c177f8c8f4199489a401058ab26a9Dianne Hackborn            out.writeInt(0);
51729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
51769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
51779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
51789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
51799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
51829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
51839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
51859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
51879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
51881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
51891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
51901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
5191617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
51921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
51931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
5194617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
51951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
51961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
51971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
51981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
5199627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
52001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
52011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
5202627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
5203f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            pr.println("*** Signal scanning :");
5204f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.logState(pr, "  ");
5205627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
52061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
52071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
52081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
52091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
52101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
52111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
521258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mGlobalWifiRunningTimer.logState(pr, "  ");
52131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
52141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5219