BatteryStatsImpl.java revision 32907cfb38bda2d3c052cf5139c5b592678fedbb
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;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
27c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
29f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState;
30e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
31627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
351afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackbornimport android.util.Slog;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
47c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
494cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tateimport java.util.concurrent.atomic.AtomicInteger;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
5932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    private static final boolean DEBUG_HISTORY = false;
6032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
6532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    private static final int VERSION = 44;
66e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
679e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // The maximum number of names wakelocks we will keep track of
689e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // per uid; once the limit is reached, we batch the remaining wakelocks
699e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    // in to one common name.
709e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    private static final int MAX_WAKELOCKS_PER_UID = 20;
719e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn
729e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn    private static final String BATCHED_WAKELOCK_NAME = "*overflow*";
739e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn
74e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private static int sNumSpeedSteps;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
761afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    private final JournaledFile mFile;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
88c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>();
89c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>();
90c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>();
91c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers
92c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            = new SparseArray<ArrayList<StopwatchTimer>>();
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    BatteryHistoryRecord mHistory;
9932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    BatteryHistoryRecord mHistoryEnd;
10032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    BatteryHistoryRecord mHistoryCache;
10132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    final BatteryHistoryRecord mHistoryCur = new BatteryHistoryRecord();
10232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mScreenOnTimer;
1193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
120617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mScreenBrightnessBin = -1;
121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
122617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
123617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    Counter mInputEventCounter;
124617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mPhoneOnTimer;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
128244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mAudioOn;
129244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mAudioOnTimer;
130244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
131244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mVideoOn;
132244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mVideoOnTimer;
133244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
134627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
135c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneSignalStrengthsTimer =
136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS];
137f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
138f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    StopwatchTimer mPhoneSignalScanningTimer;
139f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
140627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
141c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneDataConnectionsTimer =
142c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
143627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
145c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiOnTimer;
146617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mWifiOnUid = -1;
147d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
148d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    boolean mWifiRunning;
149c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiRunningTimer;
150105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
151105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
152c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mBluetoothOnTimer;
1533f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /** Bluetooth headset object */
1553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    BluetoothHeadset mBtHeadset;
1563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
1673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
1703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
171105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
172105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
173105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
174633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeStartLevel;
175633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeCurrentLevel;
176244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
178244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    // Mobile data transferred while on battery
1803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataTx = new long[4];
1813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataRx = new long[4];
1823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataTx = new long[4];
1833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataRx = new long[4];
1843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
1853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataUptime;
1863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataStart;
1873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
1883f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingCount;
1893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingStart = -1;
1903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
191f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private int mPhoneServiceState = -1;
192f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
193c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
195c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
196c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final HashMap<String, SamplingTimer> mKernelWakelockStats =
197c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, SamplingTimer>();
198c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public Map<String, ? extends SamplingTimer> getKernelWakelockStats() {
200c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mKernelWakelockStats;
201c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
202c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static int sKernelWakelockUpdateVersion = 0;
204c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
205c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int[] PROC_WAKELOCKS_FORMAT = new int[] {
206c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
207c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 1: count
208c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
209c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
211c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 5: totalTime
212c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    };
213c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
214c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final String[] mProcWakelocksName = new String[3];
215c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final long[] mProcWakelocksData = new long[3];
216c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
217c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
218c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added
219c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * to mKernelWakelockStats.
220c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
221c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> mProcWakelockFileStats =
222c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, KernelWakelockStats>();
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>();
22532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
2281afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
237617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
239e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class Counter extends BatteryStats.Counter implements Unpluggable {
2404cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        final AtomicInteger mCount = new AtomicInteger();
241617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLoadedCount;
242617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLastCount;
243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mUnpluggedCount;
244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mPluggedCount;
245617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
246617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables, Parcel in) {
2474cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = in.readInt();
2484cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
249617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLoadedCount = in.readInt();
250617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLastCount = in.readInt();
251617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = in.readInt();
252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
253617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
254617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables) {
256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void writeToParcel(Parcel out) {
2604cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(mCount.get());
261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLoadedCount);
262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLastCount);
263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mUnpluggedCount);
264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void unplug(long batteryUptime, long batteryRealtime) {
2674cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount;
2684cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mPluggedCount);
269617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void plug(long batteryUptime, long batteryRealtime) {
2724cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mPluggedCount = mCount.get();
273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Writes a possibly null Counter to a Parcel.
277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param out the Parcel to be written to.
279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param counter a Counter, or null.
280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static void writeCounterToParcel(Parcel out, Counter counter) {
282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (counter == null) {
283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0); // indicates null
284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return;
285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(1); // indicates non-null
287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            counter.writeToParcel(out);
289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
292c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            int val;
294617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (which == STATS_LAST) {
295617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mLastCount;
296617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
2974cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate                val = mCount.get();
298617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (which == STATS_UNPLUGGED) {
299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mUnpluggedCount;
300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                } else if (which != STATS_TOTAL) {
301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mLoadedCount;
302617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
303617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
304617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return val;
306617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
307617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
308617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void logState(Printer pw, String prefix) {
3094cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            pw.println(prefix + "mCount=" + mCount.get()
310617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
311617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mUnpluggedCount=" + mUnpluggedCount
312617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mPluggedCount=" + mPluggedCount);
313617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
314617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
3154cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        void stepAtomic() {
3164cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.incrementAndGet();
317617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
318617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
319617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void writeSummaryFromParcelLocked(Parcel out) {
3204cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            int count = mCount.get();
3214cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(count);
3224cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            out.writeInt(count - mLoadedCount);
323617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
324617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
325617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void readSummaryFromParcelLocked(Parcel in) {
3264cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mLoadedCount = in.readInt();
3274cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.set(mLoadedCount);
328617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLastCount = in.readInt();
3294cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUnpluggedCount = mPluggedCount = mLoadedCount;
330617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
331617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
332e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
333e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class SamplingCounter extends Counter {
334e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
335e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) {
336e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables, in);
337e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
338e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
339e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables) {
340e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables);
341e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
342e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3434cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        public void addCountAtomic(long count) {
3444cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mCount.addAndGet((int)count);
345e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
346e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
347e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
348617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
351c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static abstract class Timer extends BatteryStats.Timer implements Unpluggable {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
353c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        /**
390244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * Constructs from a parcel.
391244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param type
392244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param unpluggables
393244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param powerType
394244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param in
395244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         */
396c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
398c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastCount = in.readInt();
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTime = in.readLong();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
410c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
414c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
415c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract long computeRunTimeLocked(long curBatteryRealtime);
416c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
417c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract int computeCurrentCountLocked();
418c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLastCount);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLastTime);
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
447c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
448c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
449c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " old mTotalTime=" + mTotalTime);
450c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
451c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = computeRunTimeLocked(batteryRealtime);
452c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = computeCurrentCountLocked();
453c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
454c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType
455c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + ": new mTotalTime=" + mTotalTime);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long getTotalTimeLocked(long batteryRealtime, int which) {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
499c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                val = computeCurrentCountLocked();
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
510627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
511c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + " mCount=" + mCount
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
514627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
516627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
520c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long runTime = computeRunTimeLocked(batteryRealtime);
523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Divide by 1000 for backwards compatibility
524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong((runTime + 500) / 1000);
525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(((runTime - mLoadedTime) + 500) / 1000);
526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount);
527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount - mLoadedCount);
528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
529c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
531c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Multiply by 1000 for backwards compatibility
532c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = mLoadedTime = in.readLong() * 1000;
533c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mLastTime = in.readLong() * 1000;
534c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedTime = mTotalTime;
535c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = mLoadedCount = in.readInt();
536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mLastCount = in.readInt();
537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedCount = mCount;
538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class SamplingTimer extends Timer {
542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported count from /proc/wakelocks.
545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mCurrentReportedCount;
547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported count from /proc/wakelocks when unplug() was last
550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
551c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUnpluggedReportedCount;
553c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported total_time from /proc/wakelocks.
556c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mCurrentReportedTotalTime;
558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported total_time from /proc/wakelocks when unplug() was last
562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
563c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
564c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUnpluggedReportedTotalTime;
565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
567c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently in a discharge cycle.
568c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
569c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mInDischarge;
570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently recording reported values.
573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mTrackingReportedValues;
575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /*
577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * A sequnce counter, incremented once for each update of the stats.
578c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
579c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUpdateVersion;
580c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
581c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) {
582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables, in);
583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = in.readInt();
584c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = in.readInt();
585c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = in.readLong();
586c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = in.readLong();
587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge,
592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                boolean trackReportedValues) {
593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables);
594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = trackReportedValues;
595c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
597c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
598c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setStale() {
599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = false;
600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = 0;
601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = 0;
602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
603c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setUpdateVersion(int version) {
605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateVersion = version;
606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getUpdateVersion() {
609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUpdateVersion;
610c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedCount(int count) {
613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedCount == 0) {
614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = count;
616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = count;
620c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedTotalTime(long totalTime) {
623c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedTotalTime == 0) {
624c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
625c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = totalTime;
626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
628c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = totalTime;
630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void unplug(long batteryUptime, long batteryRealtime) {
633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.unplug(batteryUptime, batteryRealtime);
634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mTrackingReportedValues) {
635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = mCurrentReportedCount;
637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = true;
639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.plug(batteryUptime, batteryRealtime);
643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = false;
644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mTotalTime + (mInDischarge && mTrackingReportedValues
656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount + (mInDischarge && mTrackingReportedValues
661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mUnpluggedReportedCount);
668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUnpluggedReportedTotalTime);
670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeSummaryFromParcelLocked(out, batteryRealtime);
675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /**
689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * State for keeping track of timing information.
690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class StopwatchTimer extends Timer {
692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        final ArrayList<StopwatchTimer> mTimerPool;
693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mNesting;
694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The last time at which we updated the timer.  If mNesting is > 0,
698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * subtract this from the current battery time to find the amount of
699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * time we have been running since we last computed an update.
700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUpdateTime;
702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
704c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The total time at which the timer was acquired, to determine if
705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * was actually held for an interesting duration.
706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mAcquireTime;
708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
709f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        long mTimeout;
710f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
711c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool,
712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables, Parcel in) {
713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables, in);
714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateTime = in.readLong();
716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool,
719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables) {
720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables);
721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
723c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
724f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        void setTimeout(long timeout) {
725f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mTimeout = timeout;
726f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
727f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
730c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUpdateTime);
731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mNesting > 0) {
735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
736c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
738c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                super.plug(batteryUptime, batteryRealtime);
739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUpdateTime = batteryRealtime;
740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
741c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        boolean isRunningLocked() {
77532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            return mNesting > 0;
77632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
77732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long realtime = SystemClock.elapsedRealtime() * 1000;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final ArrayList<StopwatchTimer> pool) {
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long realtime = SystemClock.elapsedRealtime() * 1000;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final StopwatchTimer t = pool.get(i);
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
831f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) {
832f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                curBatteryRealtime = mUpdateTime + mTimeout;
833f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount;
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> readKernelWakelockStats() {
852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        byte[] buffer = new byte[4096];
854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int len;
855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        try {
857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            FileInputStream is = new FileInputStream("/proc/wakelocks");
858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            len = is.read(buffer);
859c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            is.close();
860c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
861c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (len > 0) {
862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                int i;
863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (i=0; i<len; i++) {
864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (buffer[i] == '\0') {
865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        len = i;
866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        break;
867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.FileNotFoundException e) {
871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.IOException e) {
873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return parseProcWakelocks(buffer, len);
877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> parseProcWakelocks(
880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            byte[] wlBuffer, int len) {
881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        String name;
882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int count;
883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long totalTime;
884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int startIndex, endIndex;
885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int numUpdatedWlNames = 0;
886c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
887c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        // Advance past the first line.
888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int i;
889c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++);
890c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        startIndex = endIndex = i + 1;
891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
892c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        synchronized(this) {
893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Map<String, KernelWakelockStats> m = mProcWakelockFileStats;
894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
895c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            sKernelWakelockUpdateVersion++;
896c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            while (endIndex < len) {
897c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (endIndex=startIndex;
898c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0';
899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex++);
900e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                // Don't go over the end of the buffer
901e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                if (endIndex < len) {
902e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                    endIndex++; // endIndex is an exclusive upper bound.
903e5795610bdc97aebfaa863b5134294aed5c7c1f2Amith Yamasani                }
904c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
905c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String[] nameStringArray = mProcWakelocksName;
906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                long[] wlData = mProcWakelocksData;
9072098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // Stomp out any bad characters since this is from a circular buffer
9082098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // A corruption is seen sometimes that results in the vm crashing
9092098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                // This should prevent crashes and the line will probably fail to parse
9102098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                for (int j = startIndex; j < endIndex; j++) {
9112098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                    if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?';
9122098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani                }
91353b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex,
91453b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                        PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null);
9152098eadfba7aba5d667579222f0fac76d1235ff0Amith Yamasani
916c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                name = nameStringArray[0];
917c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                count = (int) wlData[1];
918c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // convert nanoseconds to microseconds with rounding.
919c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                totalTime = (wlData[2] + 500) / 1000;
920c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
92153b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                if (parsed && name.length() > 0) {
922c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (!m.containsKey(name)) {
923c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        m.put(name, new KernelWakelockStats(count, totalTime,
924c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                sKernelWakelockUpdateVersion));
925c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        numUpdatedWlNames++;
926c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    } else {
927c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        KernelWakelockStats kwlStats = m.get(name);
928c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        if (kwlStats.mVersion == sKernelWakelockUpdateVersion) {
929c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount += count;
930c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime += totalTime;
931c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        } else {
932c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount = count;
933c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime = totalTime;
934c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mVersion = sKernelWakelockUpdateVersion;
935c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            numUpdatedWlNames++;
936c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        }
937c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
93853b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                }
939c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                startIndex = endIndex;
940c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
941c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
942c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (m.size() != numUpdatedWlNames) {
943c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Don't report old data.
944c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Iterator<KernelWakelockStats> itr = m.values().iterator();
945c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                while (itr.hasNext()) {
946c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (itr.next().mVersion != sKernelWakelockUpdateVersion) {
947c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        itr.remove();
948c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
949c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
950c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
951c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return m;
952c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
953c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
954c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
955c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private class KernelWakelockStats {
956c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mCount;
957c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long mTotalTime;
958c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mVersion;
959c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
960c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        KernelWakelockStats(int count, long totalTime, int version) {
961c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = count;
962c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = totalTime;
963c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mVersion = version;
964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
965c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
966c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
967c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
968c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Get the KernelWakelockTimer associated with name, and create a new one if one
969c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * doesn't already exist.
970c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
971c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public SamplingTimer getKernelWakelockTimerLocked(String name) {
972c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer kwlt = mKernelWakelockStats.get(name);
973c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kwlt == null) {
974c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
975c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    true /* track reported values */);
976c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mKernelWakelockStats.put(name, kwlt);
977c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
978c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return kwlt;
979c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
9803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataPlug(long[] dataTransfer, long currentBytes) {
9823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        dataTransfer[STATS_LAST] = dataTransfer[STATS_UNPLUGGED];
9833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        dataTransfer[STATS_UNPLUGGED] = -1;
9843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9863718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataUnplug(long[] dataTransfer, long currentBytes) {
9873718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        dataTransfer[STATS_UNPLUGGED] = currentBytes;
9883718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9893718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
9913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Radio uptime in microseconds when transferring data. This value is very approximate.
9923f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return
9933f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
9943f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private long getCurrentRadioDataUptime() {
9953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        try {
9963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
9973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (!awakeTimeFile.exists()) return 0;
9983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
9993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            String line = br.readLine();
10003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            br.close();
10013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return Long.parseLong(line) * 1000;
10023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (NumberFormatException nfe) {
10033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
10043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (IOException ioe) {
10053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
10063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
10073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return 0;
10083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
10093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
10103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
10113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
10123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
10133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getRadioDataUptimeMs() {
10143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
10153f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
10163f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
10173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
10183f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Returns the duration that the cell radio was up for data transfers.
10193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
10203f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptime() {
10213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (mRadioDataStart == -1) {
10223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return mRadioDataUptime;
10233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
10243f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentRadioDataUptime() - mRadioDataStart;
10253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
10263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
10273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
10283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int getCurrentBluetoothPingCount() {
10293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBtHeadset != null) {
10303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBtHeadset.getBatteryUsageHint();
10313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
10323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return -1;
10333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
10343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
10353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public int getBluetoothPingCount() {
10363f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBluetoothPingStart == -1) {
10373f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBluetoothPingCount;
10383f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        } else if (mBtHeadset != null) {
10393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentBluetoothPingCount() - mBluetoothPingStart;
10403f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
104182cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        return 0;
10423f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
10433f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
10443f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public void setBtHeadset(BluetoothHeadset headset) {
104582cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) {
104682cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani            mBluetoothPingStart = getCurrentBluetoothPingCount();
104782cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        }
10483f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBtHeadset = headset;
10493f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
10503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
105132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    void addHistoryRecord(long curTime) {
105232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        BatteryHistoryRecord rec = mHistoryCache;
105332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (rec != null) {
105432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCache = rec.next;
105532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
105632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            rec = new BatteryHistoryRecord();
105732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
105832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        rec.time = curTime;
105932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        rec.batteryLevel = mHistoryCur.batteryLevel;
106032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        rec.states = mHistoryCur.states;
106132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        addHistoryRecord(rec);
106232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
106332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
106432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    void addHistoryRecord(BatteryHistoryRecord rec) {
106532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        rec.next = null;
106632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mHistoryEnd != null) {
106732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd.next = rec;
106832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd = rec;
106932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        } else {
107032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistory = mHistoryEnd = rec;
107132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
107232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
107332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
107432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    void clearHistory() {
107532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mHistory != null) {
107632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryEnd.next = mHistoryCache;
107732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCache = mHistory;
107832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistory = mHistoryEnd = null;
107932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
108032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
108132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doUnplug(long batteryUptime, long batteryRealtime) {
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
10851719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff            u.mStartedTcpBytesReceived = TrafficStats.getUidRxBytes(u.mUid);
10861719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff            u.mStartedTcpBytesSent = TrafficStats.getUidTxBytes(u.mUid);
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track total mobile data
10941719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mMobileDataRx, TrafficStats.getMobileRxBytes());
10951719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mMobileDataTx, TrafficStats.getMobileTxBytes());
10961719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mTotalDataRx, TrafficStats.getTotalRxBytes());
10971719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataUnplug(mTotalDataTx, TrafficStats.getTotalTxBytes());
10983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
10993f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataStart = getCurrentRadioDataUptime();
11003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = 0;
11013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
11023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = getCurrentBluetoothPingCount();
11033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = 0;
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doPlug(long batteryUptime, long batteryRealtime) {
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11211719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mMobileDataRx, TrafficStats.getMobileRxBytes());
11221719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mMobileDataTx, TrafficStats.getMobileTxBytes());
11231719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mTotalDataRx, TrafficStats.getTotalRxBytes());
11241719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        doDataPlug(mTotalDataTx, TrafficStats.getTotalTxBytes());
11253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
11263f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataUptime = getRadioDataUptime();
11273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
11283f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
11293f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
11303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = getBluetoothPingCount();
11313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
113432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mGpsNesting;
113532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
113732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
113832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_GPS_ON_FLAG;
113932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: "
114032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
114132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
114232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
114332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting++;
11442e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStartGps();
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
114832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mGpsNesting--;
114932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mGpsNesting == 0) {
115032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_GPS_ON_FLAG;
115132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: "
115232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
115332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
115432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
11552e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStopGps();
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11573718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
116032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_SCREEN_ON_FLAG;
116132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: "
116232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
116332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
116432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mGpsNesting++;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
1167617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1168617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this);
1169617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
117532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_SCREEN_ON_FLAG;
117632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: "
117732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
117832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
1181617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1182617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1183617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1184617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1185617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1186617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1187617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightnessLocked(int brightness) {
1188617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Bin the brightness.
1189617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
1190617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (bin < 0) bin = 0;
1191617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
1192617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mScreenBrightnessBin != bin) {
119332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~BatteryHistoryRecord.STATE_SCREEN_MASK)
119432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    | (bin << BatteryHistoryRecord.STATE_SCREEN_SHIFT);
119532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: "
119632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
119732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenOn) {
1199617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (mScreenBrightnessBin >= 0) {
1200617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1201617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1202617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[bin].startRunningLocked(this);
1203617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessBin = bin;
1205617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1206617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1207617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
12084cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate    public void noteInputEventAtomic() {
12094cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate        mInputEventCounter.stepAtomic();
1210617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1211617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivityLocked(int uid, int event) {
12132e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteUserActivityLocked(event);
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
121832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_PHONE_ON_FLAG;
121932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: "
122032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
122132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
122932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_PHONE_ON_FLAG;
123032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: "
123132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
123232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
123732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1238f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    /**
1239f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * Telephony stack updates the phone state.
1240f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * @param state phone state from ServiceState.getState()
1241f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     */
1242f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneStateLocked(int state) {
1243f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        int bin = mPhoneSignalStrengthBin;
1244f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        boolean isAirplaneMode = state == ServiceState.STATE_POWER_OFF;
1245f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        // Stop all timers
1246f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (isAirplaneMode || state == ServiceState.STATE_OUT_OF_SERVICE) {
1247f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) {
1248f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) {
1249f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                    mPhoneSignalStrengthsTimer[i].stopRunningLocked(this);
125032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                }
125132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            }
125232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
1253f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        // Stop Signal Scanning timer, in case we're going into service
1254f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        while (mPhoneSignalScanningTimer.isRunningLocked()) {
1255f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.stopRunningLocked(this);
1256f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
1257f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1258f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        // If we're back in service or continuing in service, restart the old timer.
1259f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (state == ServiceState.STATE_IN_SERVICE) {
1260f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (bin == -1) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1261f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) {
1262f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1263f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1264f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        } else if (state == ServiceState.STATE_OUT_OF_SERVICE) {
1265f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalStrengthBin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1266f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].isRunningLocked()) {
1267f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].startRunningLocked(this);
1268f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1269f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalScanningTimer.isRunningLocked()) {
1270f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalScanningTimer.startRunningLocked(this);
1271f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1272f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
127332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
127432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mPhoneServiceState != state) {
127532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~BatteryHistoryRecord.STATE_PHONE_STATE_MASK)
127632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    | (state << BatteryHistoryRecord.STATE_PHONE_STATE_SHIFT);
127732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + bin + " to: "
127832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
127932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
128032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mPhoneServiceState = state;
128132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
128232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
128332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1284e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
1285627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
1286627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin;
1287f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneServiceState == ServiceState.STATE_POWER_OFF
1288f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                || mPhoneServiceState == ServiceState.STATE_OUT_OF_SERVICE) {
1289f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            // Ignore any signal strength changes when radio was turned off or out of service.
1290f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            return;
1291f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
1292e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (!signalStrength.isGsm()) {
1293e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            int dBm = signalStrength.getCdmaDbm();
1294f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (dBm >= -75) bin = SIGNAL_STRENGTH_GREAT;
1295f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else if (dBm >= -85) bin = SIGNAL_STRENGTH_GOOD;
1296f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else if (dBm >= -95)  bin = SIGNAL_STRENGTH_MODERATE;
1297f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else if (dBm >= -100)  bin = SIGNAL_STRENGTH_POOR;
1298f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1299e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        } else {
1300e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            int asu = signalStrength.getGsmSignalStrength();
1301e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1302e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT;
1303e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 8)  bin = SIGNAL_STRENGTH_GOOD;
1304e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 4)  bin = SIGNAL_STRENGTH_MODERATE;
1305e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else bin = SIGNAL_STRENGTH_POOR;
1306e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
130832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~BatteryHistoryRecord.STATE_SIGNAL_STRENGTH_MASK)
130932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    | (bin << BatteryHistoryRecord.STATE_SIGNAL_STRENGTH_SHIFT);
131032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + bin + " to: "
131132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
131232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1313627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
1314627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
1315627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1316627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthBin = bin;
1317627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1318627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1319627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1320627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1321627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
1322627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
1323627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
1324627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
1325627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
1326627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
1327627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1328627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
1329627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
1330627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1331627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
1332627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
1333627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1334627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
1335627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
1336627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1337627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1338627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
13393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData);
1340627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
134132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states = (mHistoryCur.states&~BatteryHistoryRecord.STATE_DATA_CONNECTION_MASK)
134232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    | (bin << BatteryHistoryRecord.STATE_DATA_CONNECTION_SHIFT);
134332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: "
134432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
134532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1346627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
1347627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
1348627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1349627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
1350627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
1351627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1352627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1353627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOnLocked(int uid) {
1355105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
135632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_ON_FLAG;
135732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: "
135832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
135932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
1361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
1362105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid != uid) {
1364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mWifiOnUid >= 0) {
13652e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn                getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked();
1366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1367617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = uid;
13682e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn            getUidStatsLocked(uid).noteWifiTurnedOnLocked();
1369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1370105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1371105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOffLocked(int uid) {
1373105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
137432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_ON_FLAG;
137532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: "
137632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
137732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1378105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
1379105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
1380105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid >= 0) {
13822e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn            getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked();
1383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = -1;
1384617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1385105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1386244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1387244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOnLocked(int uid) {
1388244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mAudioOn) {
138932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_AUDIO_ON_FLAG;
139032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: "
139132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
139232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1393244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = true;
1394244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.startRunningLocked(this);
1395244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
13962e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOnLocked();
1397244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1398105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1399244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOffLocked(int uid) {
1400244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mAudioOn) {
140132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_AUDIO_ON_FLAG;
140232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: "
140332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
140432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1405244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = false;
1406244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.stopRunningLocked(this);
1407244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
14082e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOffLocked();
1409244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1410244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1411244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOnLocked(int uid) {
1412244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mVideoOn) {
141332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_VIDEO_ON_FLAG;
141432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: "
141532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
141632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1417244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = true;
1418244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.startRunningLocked(this);
1419244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
14202e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOnLocked();
1421244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1422244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1423244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOffLocked(int uid) {
1424244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mVideoOn) {
142532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_VIDEO_ON_FLAG;
142632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: "
142732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
142832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1429244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = false;
1430244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.stopRunningLocked(this);
1431244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
14322e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOffLocked();
1433244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1434244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1435d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiRunningLocked() {
1436d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (!mWifiRunning) {
143732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_RUNNING_FLAG;
143832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: "
143932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
144032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1441d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = true;
1442d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.startRunningLocked(this);
1443d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1444d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1445d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1446d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiStoppedLocked() {
1447d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (mWifiRunning) {
144832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_RUNNING_FLAG;
144932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: "
145032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
145132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1452d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = false;
1453d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.stopRunningLocked(this);
1454d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1455d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1456d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1457105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
1458105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
145932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_BLUETOOTH_ON_FLAG;
146032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth on to: "
146132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
146232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1463105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
1464105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
1465105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1466105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1467105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1468105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
1469105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
147032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_BLUETOOTH_ON_FLAG;
147132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "Bluetooth off to: "
147232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
147332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
1474105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
1475105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
1476105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1477105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1478105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
147932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiFullLockNesting = 0;
148032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
1481105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
148232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
148332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_FULL_LOCK_FLAG;
148432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: "
148532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
148632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
148732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
148832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting++;
14892e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked();
1490105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1491105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1492105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
149332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiFullLockNesting--;
149432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiFullLockNesting == 0) {
149532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_FULL_LOCK_FLAG;
149632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: "
149732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
149832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
149932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
15002e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockReleasedLocked();
1501105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1502105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
150332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiScanLockNesting = 0;
150432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
1505105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
150632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
150732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_SCAN_LOCK_FLAG;
150832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock on to: "
150932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
151032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
151132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
151232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting++;
15132e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked();
1514105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1515105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1516105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
151732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiScanLockNesting--;
151832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiScanLockNesting == 0) {
151932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_SCAN_LOCK_FLAG;
152032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan lock off to: "
152132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
152232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
152332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
15242e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockReleasedLocked();
1525105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
15265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
152732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    int mWifiMulticastNesting = 0;
152832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
15295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabledLocked(int uid) {
153032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
153132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states |= BatteryHistoryRecord.STATE_WIFI_MULTICAST_ON_FLAG;
153232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: "
153332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
153432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
153532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
153632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting++;
15372e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastEnabledLocked();
15385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
15395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
15405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabledLocked(int uid) {
154132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mWifiMulticastNesting--;
154232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mWifiMulticastNesting == 0) {
154332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.states &= ~BatteryHistoryRecord.STATE_WIFI_MULTICAST_ON_FLAG;
154432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: "
154532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    + Integer.toHexString(mHistoryCur.states));
154632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
154732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
15482e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastDisabledLocked();
15495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
15505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
1552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which);
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1555617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public long getScreenBrightnessTime(int brightnessBin,
1556617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which) {
1557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
1558617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                batteryRealtime, which);
1559617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1560244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1561617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getInputEventCount(int which) {
1562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mInputEventCounter.getCountLocked(which);
1563617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1564617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
1566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which);
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1568244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1569627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
1570627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
1571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
1572627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
1573627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1574f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1575f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    @Override public long getPhoneSignalScanningTime(
1576f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            long batteryRealtime, int which) {
1577f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        return mPhoneSignalScanningTimer.getTotalTimeLocked(
1578f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                batteryRealtime, which);
1579f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
1580f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1581617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneSignalStrengthCount(int dataType, int which) {
1582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
1583617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1584617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1585627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
1586627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
1587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
1588627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
1589627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1590627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1591617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneDataConnectionCount(int dataType, int which) {
1592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
1593617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1595105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
1596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which);
1597105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1598105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1599d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    @Override public long getWifiRunningTime(long batteryRealtime, int which) {
1600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
1601d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1602d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1603105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
1604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which);
1605105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1633617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        boolean mWifiTurnedOn;
1634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mWifiTurnedOnTimer;
1635617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1636105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
1637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mFullWifiLockTimer;
1638105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
1640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mScanWifiLockTimer;
1641244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
16425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        boolean mWifiMulticastEnabled;
16435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        StopwatchTimer mWifiMulticastTimer;
1644244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mAudioTurnedOn;
1646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mAudioTurnedOnTimer;
1647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mVideoTurnedOn;
1649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mVideoTurnedOnTimer;
16505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
1651617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter[] mUserActivityCounters;
1652617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
1675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables);
1676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables);
1677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables);
16785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED,
16795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables);
1680244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables);
1681244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables);
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1703eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1704eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1708eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1709eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
17261719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff                    ? (TrafficStats.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1728eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1729eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1744105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1745617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteWifiTurnedOnLocked() {
1746617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (!mWifiTurnedOn) {
1747617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOn = true;
1748617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1749617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1750617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1751617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1752617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1753617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteWifiTurnedOffLocked() {
1754617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mWifiTurnedOn) {
1755617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOn = false;
1756617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1757617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1758617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1759617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1760617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1761105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
1762105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
1763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
1764105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
1765105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1766105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1767105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1768105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1769244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteVideoTurnedOnLocked() {
1770244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (!mVideoTurnedOn) {
1771244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOn = true;
1772244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1773244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1774244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1775244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1776244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1777244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteVideoTurnedOffLocked() {
1778244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (mVideoTurnedOn) {
1779244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOn = false;
1780244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1781244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1782244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1783244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1784244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1785244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteAudioTurnedOnLocked() {
1786244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (!mAudioTurnedOn) {
1787244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOn = true;
1788244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1789244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1790244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1791244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1792244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1793244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteAudioTurnedOffLocked() {
1794244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (mAudioTurnedOn) {
1795244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOn = false;
1796244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1797244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1798244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1799244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1800244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1801105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
1802105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
1803105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
1804105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
1805105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1806105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1807105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
1810105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
1811105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
1812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
1813105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1815105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
1818105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
1819105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
1820105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
1821105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1822105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
18235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
18245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
18255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastEnabledLocked() {
18265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (!mWifiMulticastEnabled) {
18275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = true;
18285347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this);
18295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
18305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
18315347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
18325347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
18335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastDisabledLocked() {
18345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (mWifiMulticastEnabled) {
18355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = false;
18365347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this);
18375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
18385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
18395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
1840617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1841617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public long getWifiTurnedOnTime(long batteryRealtime, int which) {
1842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mWifiTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1843617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1844244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1845244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1846244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public long getAudioTurnedOnTime(long batteryRealtime, int which) {
1847244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1848244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1849244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1850244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1851244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public long getVideoTurnedOnTime(long batteryRealtime, int which) {
1852244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1853244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1854244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1855105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1856105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
1857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
1858105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1859105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1860105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1861105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
1862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
1863105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
18645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
18655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
18665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public long getWifiMulticastTime(long batteryRealtime, int which) {
18675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime,
18685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                          which);
18695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
18705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
1871617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1872617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteUserActivityLocked(int type) {
1873617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1874617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                initUserActivityLocked();
1875617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1876617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (type < 0) type = 0;
1877617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1;
18784cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate            mUserActivityCounters[type].stepAtomic();
1879617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1880617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1881617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1882617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
1883617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
1884617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1885617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1886617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1887617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
1888617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1889617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
1890617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
1892617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1893617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1894617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
1895617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
1896617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1897617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
1898617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1899617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1900617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
19031719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff                    ? (TrafficStats.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1905244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
1941617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime);
1942105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
1943244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime);
1944244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime);
1945105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
19465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastTimer.writeToParcel(out, batteryRealtime);
1947617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1948617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
1949617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
1950617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
1951617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1952617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
1953617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1954617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
19649e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) {
19659e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // We will just drop some random set of wakelocks if
19669e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // the previous run of the system was an older version
19679e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    // that didn't impose a limit.
19689e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(wakelockName, wakelock);
19699e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
2005617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiTurnedOn = false;
2006c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables, in);
2007105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
2008c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables, in);
2009244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOn = false;
2010244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables, in);
2011244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOn = false;
2012244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables, in);
2013105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
2014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables, in);
20155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastEnabled = false;
20165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED,
20175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables, in);
2018617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() == 0) {
2019617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = null;
2020617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
2021617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
2022617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
2023617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
2024617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
2025617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
2054c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return new StopwatchTimer(type, pool, unpluggables, in);
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
2091c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2097c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2103c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
2105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2108c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return new StopwatchTimer(0, pool, unpluggables, in);
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2123eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2124eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2150eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Amount of time the process was running in the foreground.
2151eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
2152eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mForegroundTime;
2153eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2154eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2170eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from a previous save.
2171eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
2172eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLoadedForegroundTime;
2173eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2174eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
2190eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from the previous run
2191eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
2192eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLastForegroundTime;
2193eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2194eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
2210eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time since unplugged.
2211eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
2212eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mUnpluggedForegroundTime;
2213eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2214e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            SamplingCounter[] mSpeedBins;
2215e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
2218e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[getCpuSpeedSteps()];
2219e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
2220e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    mSpeedBins[i] = new SamplingCounter(mUnpluggables);
2221e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2223e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
2228eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = mForegroundTime;
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
2235105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
2236105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
2237105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
2240eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mForegroundTime);
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
2244eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLoadedForegroundTime);
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastUserTime);
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastSystemTime);
2248eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLastForegroundTime);
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastStarts);
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
2252eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mUnpluggedForegroundTime);
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
2254e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2255e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                out.writeInt(mSpeedBins.length);
2256e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
2257e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    mSpeedBins[i].writeToParcel(out);
2258e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
2264eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime = in.readLong();
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
2268eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLoadedForegroundTime = in.readLong();
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastUserTime = in.readLong();
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastSystemTime = in.readLong();
2272eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLastForegroundTime = in.readLong();
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastStarts = in.readInt();
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
2276eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = in.readLong();
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
2278e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2279e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                int bins = in.readInt();
2280e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[bins];
2281e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < bins; i++) {
2282e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    mSpeedBins[i] = new SamplingCounter(mUnpluggables, in);
2283e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2295eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public void addForegroundTimeLocked(long ttime) {
2296eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime += ttime;
2297eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
2298eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
2336eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public long getForegroundTime(int which) {
2337eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                long val;
2338eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                if (which == STATS_LAST) {
2339eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mLastForegroundTime;
2340eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                } else {
2341eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mForegroundTime;
2342eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    if (which == STATS_CURRENT) {
2343eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mLoadedForegroundTime;
2344eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    } else if (which == STATS_UNPLUGGED) {
2345eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mUnpluggedForegroundTime;
2346eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    }
2347eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                }
2348eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                return val;
2349eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
2350eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2351eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2366e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2367e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /* Called by ActivityManagerService when CPU times are updated. */
2368e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public void addSpeedStepTimes(long[] values) {
2369e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length && i < values.length; i++) {
23704cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate                    mSpeedBins[i].addCountAtomic(values[i]);
2371e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
2372e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
2373e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2374e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            @Override
2375e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public long getTimeAtCpuSpeedStep(int speedStep, int which) {
2376e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                if (speedStep < mSpeedBins.length) {
2377e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return mSpeedBins[speedStep].getCountLocked(which);
2378e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                } else {
2379e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return 0;
2380e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
2381e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWakeups = in.readInt();
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastWakeups);
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStartTime = in.readLong();
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStarts = in.readInt();
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastLaunches = in.readInt();
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLastStartTime);
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastStarts);
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastLaunches);
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2792c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
27959e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) {
27969e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    name = BATCHED_WAKELOCK_NAME;
27979e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = mWakelockStats.get(name);
27989e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
27999e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                if (wl == null) {
28009e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    wl = new Wakelock();
28019e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                    mWakelockStats.put(name, wl);
28029e0f5d9a63ba88c2bf69df0557f8c9696db370c4Dianne Hackborn                }
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_PARTIAL, mPartialTimers, mUnpluggables);
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_FULL, mFullTimers, mUnpluggables);
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_WINDOW, mWindowTimers, mUnpluggables);
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
2847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            t = new StopwatchTimer(BatteryStats.SENSOR, timers, mUnpluggables);
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartWakeLocked(String name, int type) {
2856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopWakeLocked(String name, int type) {
2863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
2870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
2878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
2885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
2892c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
2895244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
29041afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = new JournaledFile(new File(filename), new File(filename + ".tmp"));
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
2906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables);
2907617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
2908c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables);
2909617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2910617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
2911c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables);
2912627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2913c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables);
2914627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2915f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer = new StopwatchTimer(-200+1, null, mUnpluggables);
2916627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2917c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables);
2918627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2919c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiOnTimer = new StopwatchTimer(-3, null, mUnpluggables);
2920c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiRunningTimer = new StopwatchTimer(-4, null, mUnpluggables);
2921c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mBluetoothOnTimer = new StopwatchTimer(-5, null, mUnpluggables);
292218d200fd2aa26e4c9b6ca7c38bb5fd6b81e40259Mike Chan        mAudioOnTimer = new StopwatchTimer(-6, null, mUnpluggables);
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
2930633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
2931633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
29351afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile = null;
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public void setNumSpeedSteps(int steps) {
2940e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (sNumSpeedSteps == 0) sNumSpeedSteps = steps;
2941e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
2942e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2943f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void setRadioScanningTimeout(long timeout) {
2944f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneSignalScanningTimer != null) {
2945f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.setTimeout(timeout);
2946f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
2947f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
2948f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
295032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    public BatteryHistoryRecord getHistory() {
295132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        return mHistory;
295232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
295332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
295432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    @Override
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2963105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnBattery(boolean onBattery, int level) {
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
2965c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            updateKernelWakelocksLocked();
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnBattery != onBattery) {
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOnBattery = mOnBatteryInternal = onBattery;
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long uptime = SystemClock.uptimeMillis() * 1000;
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mSecRealtime = SystemClock.elapsedRealtime();
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long realtime = mSecRealtime * 1000;
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (onBattery) {
297332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    clearHistory();
297432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    mHistoryCur.batteryLevel = (byte)level;
297532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    mHistoryCur.states &= ~BatteryHistoryRecord.STATE_BATTERY_PLUGGED_FLAG;
297632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: "
297732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                            + Integer.toHexString(mHistoryCur.states));
297832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    addHistoryRecord(mSecRealtime);
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryUptimeStart = uptime;
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryRealtimeStart = realtime;
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
2983633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    mDischargeCurrentLevel = mDischargeStartLevel = level;
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doUnplug(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
298632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    mHistoryCur.batteryLevel = (byte)level;
298732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    mHistoryCur.states |= BatteryHistoryRecord.STATE_BATTERY_PLUGGED_FLAG;
298832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: "
298932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                            + Integer.toHexString(mHistoryCur.states));
299032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn                    addHistoryRecord(mSecRealtime);
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
2993633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    mDischargeCurrentLevel = level;
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doPlug(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mLastWriteTime + (60 * 1000)) < mSecRealtime) {
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mFile != null) {
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        writeLocked();
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3004633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
3005633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public void recordCurrentLevel(int level) {
300632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        if (mDischargeCurrentLevel != level) {
300732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mDischargeCurrentLevel = level;
300832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            mHistoryCur.batteryLevel = (byte)level;
300932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(SystemClock.elapsedRealtime());
301032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
3011633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
3012c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3013c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
3014c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
3015c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3016d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        if (m == null) {
3017d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            // Not crashing might make board bringup easier.
30181afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "Couldn't get kernel wake lock stats");
3019d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            return;
3020d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        }
3021d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen
3022c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
3023c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
3024c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
3025c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3026c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
3027c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
3028c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
3029c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
3030c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
3031c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3032c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
3033c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
3034c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
3035c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3036c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3037c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
3038c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
3039c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
3040c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
3041c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
3042c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
3043c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
3044c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3045c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3046c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mUptime + (curTime-mUptimeStart);
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart);
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
31383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long getTcpBytes(long current, long[] dataBytes, int which) {
31393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (which == STATS_LAST) {
31403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return dataBytes[STATS_LAST];
31413718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
31423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (which == STATS_UNPLUGGED) {
31433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                if (dataBytes[STATS_UNPLUGGED] < 0) {
31443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return dataBytes[STATS_LAST];
31453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                } else {
31463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return current - dataBytes[STATS_UNPLUGGED];
31473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                }
31483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            } else if (which == STATS_TOTAL) {
31493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_TOTAL];
31503718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            }
31513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return current - dataBytes[STATS_CURRENT];
31523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
31533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
31543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
31553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
31563718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesSent(int which) {
31571719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getMobileTxBytes(), mMobileDataTx, which);
31583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
31593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
31603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
31613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesReceived(int which) {
31621719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getMobileRxBytes(), mMobileDataRx, which);
31633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
31643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
31653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
31663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesSent(int which) {
31671719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getTotalTxBytes(), mTotalDataTx, which);
31683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
31693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
31703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
31713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesReceived(int which) {
31721719a39a4c0ff3afbf9c9e5f03f20ba50f490902Ken Shirriff        return getTcpBytes(TrafficStats.getTotalRxBytes(), mTotalDataRx, which);
31733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
31743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
3175105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
3176633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
3177105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
3178633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
3179105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
3180105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
3181105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3182633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
3183633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return mDischargeStartLevel;
3184105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
3185105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3186105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
3187633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
3188105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
3189633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
3190105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
3191105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
3192105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3193633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
3194633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return mDischargeCurrentLevel;
3195105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3197e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    @Override
3198e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public int getCpuSpeedSteps() {
3199e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return sNumSpeedSteps;
3200e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
3201e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
322032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
323132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * Retrieve the statistics object for a particular process, given
323232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * the name of the process.
323332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @param name process name
323432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @return the statistics object for the process
323532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     */
3236819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public Uid.Proc getProcessStatsLocked(String name, int pid) {
323732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        int uid;
323832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (mUidCache.containsKey(name)) {
323932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            uid = mUidCache.get(name);
324032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        } else {
3241819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani            uid = Process.getUidForPid(pid);
324232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            mUidCache.put(name, uid);
324332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
324432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        Uid u = getUidStatsLocked(uid);
324532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        return u.getProcessStatsLocked(name);
324632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
324732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
324832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    /**
32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32661afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    private static JournaledFile makeJournaledFile() {
32671afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        final String base = "/data/system/device_policies.xml";
32681afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        return new JournaledFile(new File(base), new File(base + ".tmp"));
32691afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn    }
32701afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeLocked() {
32721afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
32731afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "writeLocked: no file associated with this instance");
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
32781afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite());
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel out = Parcel.obtain();
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            writeSummaryToParcel(out);
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.write(out.marshall());
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.recycle();
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
32861afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            mFile.commit();
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastWriteTime = SystemClock.elapsedRealtime();
32898550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu            return;
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
32911afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "Error writing battery statistics", e);
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32931afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        mFile.rollback();
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
33201afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (mFile == null) {
33211afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readLocked: no file associated with this instance");
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
33281afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            File file = mFile.chooseForRead();
33291afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (!file.exists()) {
33301afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            FileInputStream stream = new FileInputStream(file);
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
33421afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.e("BatteryStats", "Error reading battery statistics", e);
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
335032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    void readHistory(Parcel in) {
335132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        mHistory = mHistoryEnd = mHistoryCache = null;
335232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        long time;
335332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        while ((time=in.readLong()) >= 0) {
335432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            BatteryHistoryRecord rec = new BatteryHistoryRecord(time, in);
335532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            addHistoryRecord(rec);
335632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
335732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
335832907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
335932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    void writeHistory(Parcel out) {
336032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        BatteryHistoryRecord rec = mHistory;
336132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        while (rec != null) {
336232907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            if (rec.time >= 0) rec.writeToParcel(out, 0);
336332907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn            rec = rec.next;
336432907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        }
336532907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        out.writeLong(-1);
336632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn    }
336732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
33711afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w("BatteryStats", "readFromParcel: version got " + version
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
337632907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        readHistory(in);
337732907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
3387633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = in.readInt();
3388633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
3389105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
3394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
3396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
3400627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3401627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
3402627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3403f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in);
3404627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3405627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
3406627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3407105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
3408105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
3409d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
3410d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.readSummaryFromParcelLocked(in);
3411105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
3412105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3414c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
34151afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NKW > 10000) {
34161afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many kernel wake locks " + NKW);
34171afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
34181afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
3419c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
3420c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
3421c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
3422c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
3423c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3424c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3425e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3426e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
3427e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
34291afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        if (NU > 10000) {
34301afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            Slog.w(TAG, "File corrupt: too many uids " + NU);
34311afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            return;
34321afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn        }
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3438617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOn = false;
3439617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in);
3440105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
3441105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
3442244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mAudioTurnedOn = false;
3443244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in);
3444244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mVideoTurnedOn = false;
3445244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in);
3446105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
3447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
34485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastEnabled = false;
34495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
34505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
3451617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
3452617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
3453617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
3454617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
3455617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
3456617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
3457617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
3458617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
3459617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
34611afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NW > 10000) {
34621afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many wake locks " + NW);
34631afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
34641afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
34791afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
34801afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many sensors " + NP);
34811afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
34821afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
34921afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
34931afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many processes " + NP);
34941afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
34951afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastUserTime = in.readLong();
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastSystemTime = in.readLong();
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastStarts = in.readInt();
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
35081afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            if (NP > 10000) {
35091afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                Slog.w(TAG, "File corrupt: too many packages " + NP);
35101afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn                return;
35111afd1c90ebe789b8d3a137004127a50d2db7e3b5Dianne Hackborn            }
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastWakeups = in.readInt();
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStartTime = in.readLong();
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStarts = in.readInt();
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastLaunches = in.readInt();
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
354932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        writeHistory(out);
355032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL));
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT));
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL));
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT));
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL));
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT));
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL));
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT));
3560633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeStartLevel);
3561633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
3562105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3565617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3566617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
3567617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3568617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3570627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3571627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
3572627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3573f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3574627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3575627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
3576627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3577105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3578d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3579105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3581c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
3582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
3583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
3584c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
3585c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
3586c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
3587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
3588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
3589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
3590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3593e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
3599105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3600617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3601105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3602c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani            u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3603c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani            u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3604105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
36055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL);
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
3608617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
3609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
3610617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
3611617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
3612617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
3613617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
3614617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
3615617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
36639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
36649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime - ps.mLoadedUserTime);
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime);
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts - ps.mLoadedStarts);
36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups - ps.mLoadedWakeups);
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time - ss.mLoadedStartTime);
36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts - ss.mLoadedStarts);
36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches - ss.mLoadedLaunches);
36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesReceived(STATS_TOTAL));
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesSent(STATS_TOTAL));
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
371932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        readHistory(in);
372032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
3727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables, in);
3728617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3729c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables, in);
3730617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3731617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
3733c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
3734627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3735c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables, in);
3736627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3737f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer = new StopwatchTimer(-200+1, null, mUnpluggables, in);
3738627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables, in);
3740627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3741105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
3742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
3743d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
3744c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiRunningTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
3745105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
3746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mBluetoothOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
3761633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = in.readInt();
3762633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_LAST] = in.readLong();
37663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_UNPLUGGED] = -1;
37673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_LAST] = in.readLong();
37683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_UNPLUGGED] = -1;
37693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_LAST] = in.readLong();
37703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_UNPLUGGED] = -1;
37713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_LAST] = in.readLong();
37723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_UNPLUGGED] = -1;
37733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
37743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = in.readLong();
37753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
37763718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
37773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = in.readInt();
37783f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
37793f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
3780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
3781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
3782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
3783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
3784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
3785244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel
3786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
3787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
3788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3795e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
3796e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeToParcelLocked(out, flags);
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writeToParcelLocked(Parcel out, int flags) {
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
381932907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
382032907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn        writeHistory(out);
382132907cfb38bda2d3c052cf5139c5b592678fedbbDianne Hackborn
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastUptime);
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastRealtime);
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
3828617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3829617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
3830617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3831617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
3833627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3834627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
3835627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3836f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime);
3837627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3838627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
3839627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3840105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
3841d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeToParcel(out, batteryRealtime);
3842105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastUptime);
38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastRealtime);
38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
38519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
38529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
38539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
38549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
38559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
3856633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeStartLevel);
3857633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
38589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
38599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getMobileTcpBytesReceived(STATS_UNPLUGGED));
38613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getMobileTcpBytesSent(STATS_UNPLUGGED));
38623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getTotalTcpBytesReceived(STATS_UNPLUGGED));
38633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getTotalTcpBytesSent(STATS_UNPLUGGED));
38643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
38653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Write radio uptime for data
38663f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeLong(getRadioDataUptime());
38673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
38683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeInt(getBluetoothPingCount());
38693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
3870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
3871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
3872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = ent.getValue();
3873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
3874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
3875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
3876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
3877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
3878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
3879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3881e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3882e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
3883e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int size = mUidStats.size();
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(size);
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < size; i++) {
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(i));
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid uid = mUidStats.valueAt(i);
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uid.writeToParcelLocked(out, batteryRealtime);
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
39069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
39071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
39081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
39091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
3910617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
39111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
39121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
3913617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
39141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
39151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
39161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
39171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
3918627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
39191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
39201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
3921627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
3922f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            pr.println("*** Signal scanning :");
3923f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.logState(pr, "  ");
3924627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
39251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
39261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
39271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
39281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
39291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
39301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
39311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiRunningTimer.logState(pr, "  ");
39321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
39331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3938